在Java String.split()方法中使用转义字符处理分隔符

时间:2013-09-07 20:45:25

标签: java regex

我在网上搜索了我的查询,但没有得到完全符合我要求的答案。我的字符串如下:

A|B|C|The Steading\|Keir Allan\|Braco|E

我的输出应如下所示:

A
B
C
The Steading|Keir Allan|Braco
E

我的要求是跳过分隔符(如果前面有转义序列)。我在String.split()中使用负面的lookbehinds尝试了以下内容:

(?<!\\)\|

但是,我的问题是分隔符将由最终用户动态定义,并且不必总是|。它可以是键盘上的任何字符(没有限制)。因此,我怀疑上述正则表达式可能会因正则表达式中不允许的某些特殊字符而失败。

我只是想知道这是否是完美的方式。

2 个答案:

答案 0 :(得分:29)

您可以使用Pattern.quote()

String regex = "(?<!\\\\)" + Pattern.quote(delim);

使用您的示例:

String delim = "|";
String regex = "(?<!\\\\)" + Pattern.quote(delim);

for (String s : "A|B|C|The Steading\\|Keir Allan\\|Braco|E".split(regex))
    System.out.println(s);
A
B
C
The Steading\|Keir Allan\|Braco
E

您可以将其扩展为使用自定义转义序列:

String delim = "|";
String esc = "+";
String regex = "(?<!" + Pattern.quote(esc) + ")" + Pattern.quote(delim);

for (String s : "A|B|C|The Steading+|Keir Allan+|Braco|E".split(regex))
    System.out.println(s);
A
B
C
The Steading+|Keir Allan+|Braco
E

答案 1 :(得分:0)

我知道这是一个旧线程,但后向解决方案存在一个问题,即不允许转义转义字符(A|B|C|The Steading\\|Keir Allan\|Braco|E)上不会发生拆分)。

线程Regex and escaped and unescaped delimiter中的正匹配解决方案效果更好(如果定界符是动态的,则使用Pattern.quote()进行修改)。