Java Regex替换为捕获组

use*_*ser 71 java regex

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

例:

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

而且我想用$ 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();
}
Run Code Online (Sandbox Code Playgroud)

它抛出IllegalStateException:找不到匹配项

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();
}
Run Code Online (Sandbox Code Playgroud)

工作正常,但我不能改变$ 1 :(

编辑:

现在,它的工作:)

ear*_*arl 78

怎么样:

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

要获得第一场比赛,请使用#find().之后,您可以#group(1)用来引用第一个匹配,并将第一个匹配值乘以3替换所有匹配.

如果你想用匹配值乘以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());
Run Code Online (Sandbox Code Playgroud)

您可能希望查看Matcher文档,其中详细介绍了这些内容以及更多内容.

  • 这非常有帮助!另外一个问题是,如果您匹配的文本和匹配项不在最后,则需要调用m.appendTail(s); (20认同)
  • 是的但你丢失了原来的字符串.如果它是"a 1 2 3"你将没有a (7认同)

Dra*_*mon 11

伯爵的回答为您提供了解决方案,但我想我会添加导致您问题的问题IllegalStateException.你在group(1)没有先调用匹配操作(例如find())的情况下进行调用.如果您刚刚使用,则不需要这样做,$1因为replaceAll()匹配操作.


shm*_*sel 6

Java 9 提供了一个Matcher.replaceAll()接受替换函数的方法:

resultString = regexMatcher.replaceAll(
        m -> String.valueOf(Integer.parseInt(m.group()) * 3));
Run Code Online (Sandbox Code Playgroud)