You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:11:35