在 Java String.split() 方法中处理带有转义字符的分隔符

2022-09-02 03:03:44

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

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

我的输出应如下所示:

A
B
C
The Steading|Keir Allan|Braco
E

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

(?<!\\)\|

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

我只是想知道这是否是做到这一点的完美方法。


答案 1

您可以使用 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

答案 2

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

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