我需要一些帮助来模拟这个正则表达式.我认为用一个例子会更容易.我需要一个与逗号匹配的正则表达式,但前提是它不在此结构中:"( )"如下所示:
,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来转义\.
你也可以使*占有欲试图提高性能,即;(?![^<>]*+>).
试试这个:
(?![^(]*\)),
Run Code Online (Sandbox Code Playgroud)
它在我的测试中对我有用,抓住了不在括号内的所有逗号.
编辑:Gopi指出需要逃避Java中的斜杠:
(?![^(]*\\)),
Run Code Online (Sandbox Code Playgroud)
编辑:艾伦摩尔指出了一些不必要的复杂性.固定.