regex 用于替换特定关键字后第一个大括号内的值的正则表达式

erhoui1w  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(98)

我有一个输入字符串,我想替换特定关键字后第一个大括号(包括大括号)内的值。
例如,在本例中,我想替换Honda后面的花括号内的值。

[{brand:”Toyota”, model:”Corolla”}, 
{brand:”BMW”, model:”X3”}, 
{brand:”Honda”, model:”{year:2022, name:Accord}”}]

因此,最终结果将类似于:

[{brand:”Toyota”, model:”Corolla”}, 
{brand:”BMW”, model:”X3”}, 
{brand:”Honda”, model:”Civic”}]

看起来像是在使用Java时,我可以使用replaceAll方法来利用正则表达式,但我无法确定此用例的正则表达式应该是什么。
我试图创建一个如下所示的正则表达式,但结果是错误的
第一次

laik7k3q

laik7k3q1#

Look-behinds是有问题的,因为(在Java中)它们必须是固定长度的。一个替代方法是捕获前缀(品牌),然后在替换字符串中重复$1
这个正则表达式将捕获商标。注意周围的括号。

(\{brand:"Honda", model:")

这将匹配模型(不包括尾部引号):

[^"]*

将这两个部分连接起来。将它们放在字符串文字中,每隔\"进行转义:

"(\\{brand:\"Honda\", model:\")[^\"]*"

(可选)添加\\s*,使其能够抵抗任意空格:

"(\\{\\s*brand\\s*:\\s*\"Honda\"\\s*,\\s*model\\s*:\\s*\")[^\"]*"

确保替换字符串以$1开头:

"$1Civic"

工作示例:

class Main
{
   public static void main(String[] args)
   {
      String input = "[{brand:\"Honda\", model:\"{year:2022, name:Accord}\"}]";
      System.out.println(input);
      String output = input.replaceAll(
         "(\\{\\s*brand\\s*:\\s*\"Honda\"\\s*,\\s*model\\s*:\\s*\")[^\"]*",
         "$1Civic");
      System.out.println(output);
   }
}

输出量:

[{brand:"Honda", model:"{year:2022, name:Accord}"}]
[{brand:"Honda", model:"Civic"}]

相关问题