java - 我如何用正则表达式替换这个函数
问题描述
我有一个格式为 yy_MM_someRandomString_originalFileName 的文件名。
例子:
02_01_fEa3129E_my Pic.png
我想替换前 2 个下划线,/
以便示例变为:
02/01/fEa3129E_my Pic.png
这可以通过 replaceAll 来完成,但问题是文件也可能包含下划线。
@Test
void test() {
final var input = "02_01_fEa3129E_my Pic.png";
final var formatted = replaceNMatches(input, "_", "/", 2);
assertEquals("02/01/fEa3129E_my Pic.png", formatted);
}
private String replaceNMatches(String input, String regex,
String replacement, int numberOfTimes) {
for (int i = 0; i < numberOfTimes; i++) {
input = input.replaceFirst(regex, replacement);
}
return input;
}
我使用循环解决了这个问题,但是有没有一种纯粹的正则表达式方法来做到这一点?
编辑:这种方式应该能够让我更改参数并将下划线的数量从 2 增加到 n。
解决方案
您可以使用 2 个捕获组并在替换中使用那些_
将替换为/
^([^_]+)_([^_]+)_
用。。。来代替:
$1/$2/
例如:
String regex = "^([^_]+)_([^_]+)_";
String string = "02_01_fEa3129E_my Pic.png";
String subst = "$1/$2/";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
String result = matcher.replaceFirst(subst);
System.out.println(result);
结果
02/01/fEa3129E_my Pic.png
推荐阅读
- vuejs2 - 如何避免vue组件重绘?
- postgresql - 索引中的碎片是如何发生的?
- vsto - 保存到约会项目后,Outlook VSTO AddIn 中的 ItemChange 被多次调用
- javascript - 编写 JavaScript 条件语句对三个数字进行排序
- java - Windows 更新后 Android Studio AVD 模拟器透明
- javascript - 在 chrome 本地存储中附加一个数组
- php - MySQL UPDATE WHERE 的行为与 SELECT WHERE 不同
- python - Kafka Python 使用自定义时间戳发送数据
- r - 使用 mvrnorm 预测相关值并包括时间自相关
- php - prestashop中用户帐户注册的php href