我在网上搜索了我的查询,但没有得到完全符合我要求的答案.我有我的字符串如下:
A|B|C|The Steading\|Keir Allan\|Braco|E
Run Code Online (Sandbox Code Playgroud)
我的输出应如下所示:
A
B
C
The Steading|Keir Allan|Braco
E
Run Code Online (Sandbox Code Playgroud)
我的要求是跳过分隔符,如果前面是转义序列.我尝试了以下使用负面的lookbehinds String.split():
(?<!\\)\|
Run Code Online (Sandbox Code Playgroud)
但是,我的问题是分隔符将由最终用户动态定义,并且不必总是|.它可以是键盘上的任何字符(没有限制).因此,我怀疑上述正则表达式可能会因正则表达式中不允许的某些特殊字符而失败.
我只是想知道这是否是完美的方式.
ars*_*jii 30
你可以使用Pattern.quote():
String regex = "(?<!\\\\)" + Pattern.quote(delim);
Run Code Online (Sandbox Code Playgroud)
使用你的例子:
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
A B C The Steading+|Keir Allan+|Braco E
小智 5
我知道这是一个旧线程,但是后向解决方案有一个问题,它不允许转义转义字符(拆分不会发生在A|B|C|The Steading\\|Keir Allan\|Braco|E))。
线程正则表达式以及转义和非转义分隔符中的正匹配解决方案效果更好(Pattern.quote()如果分隔符是动态的,则使用修改)。