Java 正则表达式替换为捕获组

2022-08-31 12:25:55

有没有办法用捕获组的已修改内容替换正则表达式?

例:

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher(text);
resultString = regexMatcher.replaceAll("$1"); // *3 ??

我想用$1乘以3替换所有出现次数。

编辑:

看起来,有些不对劲:(

如果我使用

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll(regexMatcher.group(1));
} catch (Exception e) {
    e.printStackTrace();
}

它抛出一个非法状态异常:未找到匹配项

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll("$1");
} catch (Exception e) {
    e.printStackTrace();
}

工作正常,但我无法更改$ 1:(

编辑:

现在,它正在:)


答案 1

怎么样:

if (regexMatcher.find()) {
    resultString = regexMatcher.replaceAll(
            String.valueOf(3 * Integer.parseInt(regexMatcher.group(1))));
}

要获取第一个匹配项,请使用 。之后,您可以使用 来引用第一个匹配项,并将所有匹配项替换为第一个 maches 值乘以 3。#find()#group(1)

如果您想将每个匹配项替换为该匹配项的值乘以 3:

    Pattern p = Pattern.compile("(\\d{1,2})");
    Matcher m = p.matcher("12 54 1 65");
    StringBuffer s = new StringBuffer();
    while (m.find())
        m.appendReplacement(s, String.valueOf(3 * Integer.parseInt(m.group(1))));
    System.out.println(s.toString());

你可能想看看 Matcher 的文档,其中详细介绍了这一点以及更多内容。


答案 2

厄尔的回答给了你解决方案,但我想我会补充一下导致你的问题是什么。您在未先调用匹配操作(例如 )的情况下进行调用。如果您只是使用,则不需要这样做,因为这是匹配操作。IllegalStateExceptiongroup(1)find()$1replaceAll()