java - 在 Java String.split() 方法中使用转义字符处理定界符

标签 java regex

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

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

我的输出应该如下所示:

A
B
C
The Steading|Keir Allan|Braco
E

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

(?<!\\)\|

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

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

最佳答案

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

You can extend this to use a custom escape sequence as well:

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

关于java - 在 Java String.split() 方法中使用转义字符处理定界符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677762/

相关文章:

java - Dropwizard:删除 INFO 级别的日志但保留 DEBUG 级别的日志

java - 如何在单个对象中创建多个比较器

regex - 匹配所有不以指定字符串结尾的字符

javascript正则表达式从字符串中删除子字符串

php - 单词边界与字符串开头和字符串结尾 anchor (Regex) 之间有什么区别?

javascript - 使用正则表达式替代 HTML 解析

python - 为什么\b\w+\b 不匹配一个词?

java - 有什么办法可以在 Thymeleaf 3.0.5 中添加 ExclusionStrategy 吗?

java - 代码不会输出输入的内容,也不会计算输入的数字

java - 不知道为什么我在这里被划红线