Java正则表达式帮助:捕获键值对

Daw*_*ood 3 java regex parsing

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

a0=d235 a1=2314 com1="abcd" com2="a b c d"
Run Code Online (Sandbox Code Playgroud)

使用这篇文章的帮助,我能够编写以下正则表达式来捕获键值对:

Pattern.compile("(\\w*)=(\"[^\"]*\"|[^\\s]*)");
Run Code Online (Sandbox Code Playgroud)

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

a0=d235
a1=2314
com1="abcd"
com2="a b c d"
Run Code Online (Sandbox Code Playgroud)

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

a0=d235
a1=2314
com1=abcd
com2=a b c d
Run Code Online (Sandbox Code Playgroud)

编辑:

可以通过根据是否存在引号来捕获不同组中的值来实现上述目的.我正在为解析器编写此代码,因此出于性能原因,我试图提出一个可以返回相同组号中的值的正则表达式.

use*_*279 9

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

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();
}
Run Code Online (Sandbox Code Playgroud)

更新

这是针对更新问题的新解决方案.这个正则表达式应用积极的前瞻和后瞻,以确保有一个引用而不实际解析它.这样,上面的组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);
}
Run Code Online (Sandbox Code Playgroud)

产量

a0=d235
a1=2314
com1=abcd
com2=a b c d
Run Code Online (Sandbox Code Playgroud)