首页 > 解决方案 > 我如何用正则表达式替换这个函数

问题描述

我有一个格式为 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。

标签: javaregex

解决方案


您可以使用 2 个捕获组并在替换中使用那些_将替换为/

^([^_]+)_([^_]+)_

用。。。来代替:

$1/$2/

正则表达式演示| Java 演示

例如:

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

推荐阅读