Java正则replaceFirst匹配首个}失效问题及解决办法
问题分析与解决方案
为什么正则会匹配到第二个闭合花括号?
核心原因是你用的.*属于贪婪匹配模式——它会尽可能匹配最长的符合规则的文本片段。
你的正则[$][{].*[}]/拆解一下:
[$][{]:匹配开头的${.*:匹配任意数量的任意字符(贪婪模式)[}]/:匹配}/
在你的目标字符串${project_loc:A}/Foo.yaml;${project_loc:B}/Bar.yaml中,贪婪的.*会从第一个${开始,一直匹配到最后一个}(也就是${project_loc:B}里的}),再匹配后面的/,最终整个被替换的片段是${project_loc:A}/Foo.yaml;${project_loc:B}/,替换后自然只剩Bar.yaml了。
如何修改正则达成预期效果?
把贪婪匹配改成非贪婪匹配即可,只需要把.*改成.*?——非贪婪模式会匹配最短的符合规则的片段。
同时注意在Java字符串中,正则的特殊字符($、{、})需要用双重反斜杠转义(因为Java字符串本身会解析一次反斜杠),最终的正则表达式应该是:
Str.replaceFirst("\\$\\{.*?\\}/", "")
验证效果
执行修改后的代码:
String Str = new String("${project_loc:A}/Foo.yaml;${project_loc:B}/Bar.yaml"); System.out.println(Str.replaceFirst("\\$\\{.*?\\}/", ""));
输出结果就是你预期的:Foo.yaml;${project_loc:B}/Bar.yaml
如果你不想用转义,也可以用字符类保持你原来的写法,改成非贪婪模式:
Str.replaceFirst("[$][{].*?[}]/", "")
效果是完全一致的。
内容的提问来源于stack exchange,提问作者Saurav Sahu
相关产品推荐
相关产品推荐

