【问题标题】:Handling delimiter with escape characters in Java String.split() method在 Java String.split() 方法中处理带有转义字符的分隔符
【发布时间】:2013-09-07 20:45:25
【问题描述】:

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

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

我的输出应该如下所示:

A
B
C
The Steading|Keir Allan|Braco
E

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

(?<!\\)\|

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

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

【问题讨论】:

    标签: java regex


    【解决方案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);
    
    一个 乙 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+|凯尔艾伦+|布拉科 乙

    【讨论】:

    • 感谢您的及时回复。但是,我想知道正则表达式中是否允许所有特殊字符。有什么例外吗?
    • @user2757740 阅读Pattern.quote()的链接文档;它需要一个字符串并转义所有特殊字符。没有任何例外。
    • 这解决了我的大部分问题。非常感谢.. 但是,我也想为我的转义序列实现相同的 pattern.quote()。但是,恐怕它不起作用:( (?
    • @user2757740 "\\\\" 已被引用。也许你的意思是Pattern.quote("\\")
    • 谢谢兄弟!..你让我开心,拯救了我的周末..非常感谢您的帮助...\m/
    【解决方案2】:

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

    线程Regex and escaped and unescaped delimiter 中的正匹配解决方案效果更好(如果分隔符是动态的,则使用Pattern.quote() 进行修改)。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2011-10-24
      • 2011-11-21
      • 2011-08-25
      • 2010-10-02
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多