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

新手上路,请多包涵

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

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

我的输出应如下所示:

 A
B
C
The Steading|Keir Allan|Braco
E

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

 (?<!\\)\|

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

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

原文由 user2757740 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 379
2 个回答

您可以使用 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
The Steading\|Keir Allan\|Braco
乙


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

 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
The Steading+|Keir Allan+|布拉科
乙

原文由 arshajii 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

线程 Regex 中的正匹配解决方案以及转义和未转义的定界符 效果更好(如果定界符是动态的,则使用 Pattern.quote() 进行修改)。

原文由 Jan Cetkovsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题