21

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

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

我的输出应如下所示:

A
B
C
The Steading|Keir Allan|Braco
E

如果分隔符前面有转义序列,我的要求是跳过分隔符。我已经尝试了以下使用负面的lookbehinds in String.split()

(?<!\\)\|

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

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

4

2 回答 2

38

您可以使用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);
一个
乙
C
Steading\|Keir Allan\|布拉科
乙

您也可以扩展它以使用自定义转义序列:

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);
一个
乙
C
Steading+|凯尔艾伦+|布拉科
乙
于 2013-09-07T20:48:07.827 回答
4

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

线程Regex 和转义和非转义分隔符中的正匹配解决方案效果更好(Pattern.quote()如果分隔符是动态的,则使用修改)。

于 2018-08-03T23:43:12.937 回答