如何使用排除转义的令牌版本的正则表达式拆分字符串?

时间:2009-07-03 01:17:59

标签: java regex

在Java中,我使用String split方法拆分包含以分号分隔的值的字符串。

目前,我有以下一行在99%的情况下都有效。

String[] fields = optionsTxt.split(";");

但是,已添加要求以包含转义分号作为字符串的一部分。因此,以下字符串应解析为以下值:

"Foo foo;Bar bar" => [Foo foo] [Bar bar]
"Foo foo\; foo foo;Bar bar bar" => [Foo foo\; foo foo] [Bar bar bar]

这应该很简单,但我完全不确定如何去做。我只是想在有\时没有标记化;并且只有在有。;

时才进行标记化

有没有人知道这个神奇的公式?

4 个答案:

答案 0 :(得分:2)

试试这个:

String[] fields = optionsTxt.split("(?<!\\\\);");

答案 1 :(得分:1)

可能有更好的方法,但快速而肮脏的方法是先取代\;使用一些不会出现在输入缓冲区中的字符串,如{{ESCAPED_SEMICOLON}},然后执行tokenize;然后当你拉出每个标记时,反向执行原始替换以放回\;

答案 2 :(得分:1)

使用正则表达式(java.util.regex)

[^\\];

应该是您正在寻找的而不进行双重替换。

try it out using a tool like this

答案 3 :(得分:0)

仅使用您提供的示例,您可以使用上面的对象代码。如果您希望仅在分号前有偶数个反斜杠时才进行拆分,请尝试以下操作:

String[] fields = optionsTxt.split("((?<!\\\\)|(?<=[^\\\\](\\\\\\\\){0,15}));");

我随意挑选了15个。如果需要,可将其更改为更高的数字。