【问题标题】:Java - string.split with colliding regexesJava - 带有冲突正则表达式的 string.split
【发布时间】:2019-03-30 06:48:44
【问题描述】:

我最近遇到了这个问题,不知道如何解决。我知道在 String 类中,我们有 split 方法,它接受一个正则表达式,并基于该正则表达式,将给定的字符串拆分为不同的字符串并在字符串数组中返回。

例如,如果我有,

String s = "A,B,C";

我愿意,

System.out.println(Arrays.toString(s.split(",")));

它将打印 [A, B, C] 到输出控制台。

现在假设我的字符串是

String s = "A,\"\"B\"\",\"\"C\"\",D";   //easier to read version: A,""B"",""C"",D

我使用下面的正则表达式来分割字符串,

String regex = ",|,\"\"|\"\",|\"\",\"\"";  // matches , OR ,"" OR "", OR "",""
System.out.println(Arrays.toString(s.split(regex)));

我得到的输出是 [A, ""B, ""C, D]。这里的分裂如何?以及如何定义我的正则表达式以便得到 [A, B, C, D] 作为我的输出?

注意:我知道我想要实现的目标可以通过其他方式完成(比如 replaceAll 方法),但我只想使用 String.split 来解决这个问题,因为我想知道在这种情况下如何使用它.

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    总是按照从大到小的顺序排列备选方案:

    String regex = "\"\",\"\"|,\"\"|\"\",|,";
    

    【讨论】:

    • 谢谢!有用 :)。那么拆分是否总是匹配第一个可能的子正则表达式?
    • @mettleap:是的,确实如此。
    • @mettleap 查看regex101.com/r/Ww7tjC/2 了解您的正则表达式是如何处理的
    【解决方案2】:

    正如here 解释的那样,正则表达式引擎急于在成功匹配逗号(第一个替换)后停止。另一个答案是解决此问题的一种方法。另一种方法是使用量词:

    ,(\"\")?|\"\"(,\"\")?
    

    Regex101了解它的工作原理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多