正则表达式找到不在"(和)"内的逗号

Ala*_*aor 5 java regex

我需要一些帮助来模拟这个正则表达式.我认为用一个例子会更容易.我需要一个与逗号匹配的正则表达式,但前提是它不在此结构中:"( )"如下所示:

,a,b,c,d,"("x","y",z)",e,f,g,
Run Code Online (Sandbox Code Playgroud)

然后前五个和后四个逗号应匹配表达式,两个之间xyz和内部的逗号不应该匹配( ).

我尝试了很多组合,但正则表达式对我来说仍然有点模糊.

我希望它与Java中的split方法一起使用.这个例子很简短,但它可以更长,并且在"(和)"之间有不止一个部分.split方法接收一个表达式,如果某些文本(在本例中为逗号)与表达式匹配,则它将成为分隔符.

所以,想要做这样的事情:

String keys[] = row.split(expr);
System.out.println(keys[0]); // print a
System.out.println(keys[1]); // print b
System.out.println(keys[2]); // print c
System.out.println(keys[3]); // print d
System.out.println(keys[4]); // print "("x","y",z)"
System.out.println(keys[5]); // print e
System.out.println(keys[6]); // print f
System.out.println(keys[7]); // print g
Run Code Online (Sandbox Code Playgroud)

谢谢!

pol*_*nts 14

你可以用负面的前瞻来做到这一点.这是一个稍微简化的问题来说明这个想法:

String text = "a;b;c;d;<x;y;z>;e;f;g;<p;q;r;s>;h;i;j";

String[] parts = text.split(";(?![^<>]*>)");

System.out.println(java.util.Arrays.toString(parts));
//  _  _  _  _  _______  _  _  _  _________  _  _  _
// [a, b, c, d, <x;y;z>, e, f, g, <p;q;r;s>, h, i, j]
Run Code Online (Sandbox Code Playgroud)

需要注意的是,而不是,,分隔符是现在;,取而代之的"("),括号只是<>,但这个想法仍然有效.


在模式上

[…]是一个角色类.类似于[aeiou]匹配任何一个小写元音的东西.[^…]是一个否定的角色类.[^aeiou]匹配除小写元音之外的任何东西.

*重复说明符可以用来匹配前述图案的"零或更多的时间".

(?!…)是一个消极的前瞻; 它可用于断言某个模式匹配,向前看(即向右)当前位置.

该模式[^<>]*>匹配除括号外的所有内容的序列(可能为空),最后是一个关闭类型的paranthesis.

将上述所有内容放在一起,我们得到;(?![^<>]*>),匹配a ;,但只有当我们看不到右括号作为其右边的第一个括号时,因为见证这种现象只会意味着;括号中的"内部".

通过一些修改,该技术可以适应原始问题.记住要逃避正则表达式元字符(并且)必要时,当然"以及\Java字符串文字必须通过前面的a来转义\.

你也可以使*占有欲试图提高性能,即;(?![^<>]*+>).

参考


cna*_*ney 6

试试这个:

(?![^(]*\)),
Run Code Online (Sandbox Code Playgroud)

它在我的测试中对我有用,抓住了不在括号内的所有逗号.

编辑:Gopi指出需要逃避Java中的斜杠:

(?![^(]*\\)),
Run Code Online (Sandbox Code Playgroud)

编辑:艾伦摩尔指出了一些不必要的复杂性.固定.