替换捕获组

Dón*_*nal 11 java regex

如果我有一个捕获组的正则表达式,例如foo(_+f).如果我将其与字符串匹配,并希望替换所有匹配中的第一个捕获组,baz以便这样做

foo___f blah foo________f
Run Code Online (Sandbox Code Playgroud)

转换为:

foobaz blah foobaz
Run Code Online (Sandbox Code Playgroud)

使用标准库似乎没有任何简单的方法.如果我使用 Matcher.replaceAll(),这将替换整个模式的所有匹配并将字符串转换为

baz blah baz
Run Code Online (Sandbox Code Playgroud)

显然,我可以迭代匹配,存储每个捕获组的开始和结束索引,然后返回并替换它们,但有更简单的方法吗?

谢谢,唐

pol*_*nts 25

我想你想要这样的东西?

    System.out.println(
        "foo__f blah foo___f boo___f".replaceAll("(?<=foo)_+f", "baz")
    ); // prints "foobaz blah foobaz boo___f"
Run Code Online (Sandbox Code Playgroud)

在这里,您只需将整个匹配替换为"baz",但匹配使用lookbehind确保_+f前面有foo.

也可以看看


如果不可能使用lookbehind(可能因为长度不是有限的),那么只需捕获你不替换的内容,并在替换字符串中引用它们.

    System.out.println(
        "fooooo_f boooo_f xxx_f".replaceAll("(fo+|bo+)(_+f)", "$1baz")
    ); // prints "fooooobaz boooobaz xxx_f"
Run Code Online (Sandbox Code Playgroud)

所以这里我们实际上只是替换了\2匹配.

  • 第二个建议很简单,有效,我应该想到自己,并不需要我学习外观:) (2认同)