在Java中分割字符串,按";"分割但不按"\\;"分割

3
在Java中,我尝试使用String.split()方法将字符串按";"拆分,但不是按"\\\\;"(两个反斜线后跟一个分号)拆分。
例如:"aa;bb;cc\\;dd;ee\\;;ff"应该被拆分成;
aa

bb

cc\\;dd

ee\\;

ff

我该如何使用正则表达式来实现这个目标?
马库斯

1
\\\\;怎么样?) - Tom Hawtin - tackline
在“\\”上分割;仅在“\;”(2个反斜杠后跟一个分号)上分割。我不想在那里分割。 - Markus K
最简单的方法可能是在“;”上进行拆分,并在每个以“\”结尾的部分末尾添加一个“;”。 - Jorn
很可能是重复的问题:http://stackoverflow.com/questions/1077432/how-do-i-split-a-string-using-a-regular-expression-that-excludes-an-escaped-versi - gulbrandr
3个回答

10
使用
"aa;bb;cc\\;dd;ee\\;;ff".split("(?<!\\\\);");

(?<!...)被称为“零宽度后顾”。意思是,在不匹配双斜杠的情况下,在所有以双斜杠为前缀的;字符处进行分割。四个反斜杠用于将反斜杠转义给正则表达式解析器。因此,实际在分割中使用的正则表达式应该如下:

(?<!\\);

1
这需要引用 \ - Mihai Toader
2
我不知道...所有的反斜杠让我感到困惑 :-) 我检查了我的代码,它匹配正确... - Lukas Eder
我也认为这必须是8个反斜杠,这在正则表达式层面上等于4个反斜杠,实际上是2个真正的反斜杠。 - Ingo
@Ingo:但我们不想要2个实际的反斜杠,只需要一个。除非,OP在他的问题中犯了错误... - Lukas Eder
是的,你可能是对的,因为他引用了他的示例字符串。另一方面,他说“2个反斜杠后跟一个分号”。 - Ingo

5

这被称为负回溯断言,语法类似于(?<!a)b。它会匹配在任何未以a为前导的b上。您可能需要像这样的内容:

(?<!\\\\);

0

这里是一个以“.”作为分隔符的代码示例:

String p = "hello.regex\\.brain\\.twister";
System.out.println( p );
for (String s : p.split( "(?<!\\\\)\\.", -1 )) {
  System.out.println( "-> "+ s );
}

将输出:

hello.regex\.brain\.twister
-> hello
-> regex\.brain.\twister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接