如果我有一个捕获组的正则表达式,例如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匹配.