Java中替换指定关键词后首个花括号内容的正则问题
解决Java正则替换特定关键词后首个花括号内容的问题
问题分析
你需要替换Honda之后首个花括号(含括号)内的内容,但之前的正则错误地把Honda到花括号前的文本也替换了,导致结果异常。
正确正则方案
这里提供两种可行的实现方式:
方案1:使用捕获组保留前后内容
通过捕获组把Honda到花括号前的文本、花括号后的引号分别保留,只替换花括号内的内容:
String output = input.replaceAll("(Honda.*?\"\\{).*?(\\}\")", "$1Civic$2");
- 捕获组
(Honda.*?\"\\{):匹配从Honda开始到"{的所有内容(非贪婪匹配,确保只找第一个花括号) .*?:匹配花括号内的任意内容(非贪婪,避免匹配到后续无关的花括号)- 捕获组
(\\}\"):匹配花括号闭合后的引号 - 替换为
$1Civic$2:保留前后捕获的内容,中间替换成目标文本Civic
方案2:使用正向断言精准定位目标
通过正向断言限定目标花括号的上下文,直接替换花括号及内部内容:
String output = input.replaceAll("(?<=Honda.*?\")\\{.*?\\}(?=\")", "Civic");
(?<=Honda.*?\"):正向断言,确保目标花括号前面存在Honda和一个引号(限定在model的取值范围内)\\{.*?\\}:匹配第一个花括号及内部的所有内容(?=\"):正向断言,确保目标花括号后面紧跟一个引号- 直接替换为
Civic,刚好替换掉整个{year:2022, name:Accord}部分
验证结果
两种方案都能得到期望输出:
[{brand:”Toyota”, model:”Corolla”}, {brand:”BMW”, model:”X3”}, {brand:”Honda”, model:”Civic”}]
内容的提问来源于stack exchange,提问作者Ozlem
相关产品推荐
相关产品推荐

