Java Pattern拆分考虑捕获组

时间:2012-03-16 15:56:01

标签: java regex

我需要拆分传递正则表达式的字符串,但拆分令牌只是正则表达式的第1组。一个例子:

Original String = "paulo\\;Is\\;In;Real;Doubt"

使用split = ["paulo\\;Is\\;In", "Real", "Doubt"]

形成的数组

我的第一个想法是使用正则表达式:[^\\\\][;]但它显然不起作用。

输出为:["paulo\\;Is\\;I", "Rea", "Doubt"](我正在使用String.split()方法。)

我的第二个想法是使用;作为一个组:[^\\\\]([;]),但我不能告诉split方法只将group(1)视为拆分令牌。< / p>

4 个答案:

答案 0 :(得分:3)

你的问题很难回答,因为它完全不清楚。你说你的拆分令牌“只是正则表达式的第1组”。正则表达式的第1组?

编辑:仍然很难回答,你为什么不澄清?

无论如何,如果你想要的是“拆分';',但只有当它没有被'\'转义时”,那么你可以使用负面的lookbehind来获得你想要的东西。

示例:

"paulo\\;Is\\;In;Real;Doubt".split("(?<!\\\\);");

给出

[ "paulo\;Is\;In", "Real", "Doubt" ]

答案 1 :(得分:0)

问题是以下表达式为真:

("\;").equals(";")

所以你的原始字符串等于:

"paulo;Is;In;Real;Doubt"

答案 2 :(得分:0)

嗯,当我在

时遇到错误时,我不得不稍微修改你的输入
String x = "paulo\\;Is\\;In;Real;Doubt";
String[] res = x.split("\\\\;");

答案 3 :(得分:0)

如果转义可以逃避任何事情,那么你最好只用一个直接的全局正则表达式来找到所有,只有一个捕获组。

原始正则表达式:

(?:(?<=;)|(?<=^))([^;\\]*(?:\\.[^;\\]*)*)(?:;|$)

扩展:

(?:                              // prevent (mitigate) re-capture of last field
   (?<=;)
 | (?<=^)
)

( [^;\\]* (?:\\.[^;\\]*)* )      // Capture the field, grp 1 (can be blank)

(?:                              // The delimiter or end o string                             
   ;
 |
   $
)