在Java中使用RegEx,如何捕获由双引号分隔的组,不包括用双引号括起来的组?

sup*_*sky 0 java regex

例:

abc | efg || $something("arg 1", "arg 2||(a|b)") || 123
Run Code Online (Sandbox Code Playgroud)

或没有空格

abc|efg||$something("arg 1", "arg 2||(a|b)")||123
Run Code Online (Sandbox Code Playgroud)

需要什么RegEx模式才能获得以下组:

abc | efg
$something("arg 1", "arg 2||(a|b)")
123
Run Code Online (Sandbox Code Playgroud)

共3组.

另一个例子:

"abc || efg" || 123
Run Code Online (Sandbox Code Playgroud)

应该给我2组

"abc || efg"
123
Run Code Online (Sandbox Code Playgroud)

基本上它通过双管切割或分割字符串,但不包括双引号内的双管.

我失败的尝试如下:

.+?(=\|?\ |)|*.

\ "+ \.?" |.+?(=\|?\ |)|*.

fun*_*urm 5

这就是我要做的,正则表达式:

(?:^|\|\|)(?:(?!\|\|)(?!").|"(?:[^"\\]|\\.)*")*
Run Code Online (Sandbox Code Playgroud)

这里有 Regex101演示.你可以看到右边的匹配,我把它们放在捕获组中以省略||,你可以用m.group(1)Java 来获取它们.Java不是我的强项,但它应该是这样的:

String s ="abc | efg || $something(\"arg 1\", \"arg 2||(a|b)\") || 123";   
String patternStr="(?:^|\\|\\|)(?:(?!\\|\\|)(?!\").|\"(?:[^\"\\\\]|\\\\.)*\")*";
Pattern p = Pattern.compile(patternStr);
Matcher m = p.matcher(s);
while (m.find()){
    System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)

编辑:已经实现回顾你可能想接受"$something("arg with \" in it", "arg 2||(a|b)"这样更新的正则表达式.

补充:结合波希米亚的解决方案,如果这更容易,你可以拆分:

\|\|(?=(?:(?:(?:[^"\\]|\\.)*"){2})*[^"]*$)
Run Code Online (Sandbox Code Playgroud)

Regex101或Java:

String[] parts = str.split("\\|\\|(?=(?:(?:(?:[^\"\\\\]|\\\\.)*\"){2})*[^\"]*$)");
Run Code Online (Sandbox Code Playgroud)