gpt4 book ai didi

Java 正则表达式帮助 : capturing key-value pairs

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:16 24 4
gpt4 key购买 nike

我正在尝试从具有以下形式的字符串中捕获键值对:

a0=d235 a1=2314 com1="abcd" com2="a b c d"

使用来自 this post 的帮助,我能够编写以下捕获键值对的正则表达式:

Pattern.compile("(\\w*)=(\"[^\"]*\"|[^\\s]*)");

问题在于此模式中的第二组也捕获了引号,如下所示:

a0=d235
a1=2314
com1="abcd"
com2="a b c d"

如何排除引号?我想要这样的东西:

a0=d235
a1=2314
com1=abcd
com2=a b c d

编辑:

可以根据是否有引号,在不同的组中抓取值来实现上述目的。我正在为解析器编写这段代码,因此出于性能原因,我试图提出一个可以返回同一组编号中的值的正则表达式。

最佳答案

这个怎么样?想法是将最后一组分成 2 组。

Pattern p = Pattern.compile("(\\w+)=\"([^\"]+)\"|([^\\s]+)");

String test = "a0=d235 a1=2314 com1=\"abcd\" com2=\"a b c d\"";
Matcher m = p.matcher(test);

while(m.find()){
System.out.print(m.group(1));
System.out.print("=");
System.out.print(m.group(2) == null ? m.group(3):m.group(2));
System.out.println();
}

更新

这是针对更新后的问题的新解决方案。此正则表达式应用正向前瞻和后视以确保有引述而不实际解析它。这样,上面的第 2 组和第 3 组就可以放在同一个组中(下面的第 2 组)。返回组 0 时无法排除引号。

Pattern p = Pattern.compile("(\\w+)=\"*((?<=\")[^\"]+(?=\")|([^\\s]+))\"*");

String test = "a0=d235 a1=2314 com1=\"abcd\" com2=\"a b c d\"";
Matcher m = p.matcher(test);

while(m.find()){
print m.group(1);
print "="
println m.group(2);
}

输出

a0=d235
a1=2314
com1=abcd
com2=a b c d

关于Java 正则表达式帮助 : capturing key-value pairs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com