【问题标题】:Java regex pattern matcherJava 正则表达式模式匹配器
【发布时间】:2012-07-22 08:51:11
【问题描述】:

我有一个如下格式的字符串:

String name = "A|DescA+B|DescB+C|DescC+...X|DescX+"

所以重复的模式是?|?+,不知道会有多少。我要提取的部分是 |...之前的部分,因此对于我的示例,我想提取一个列表(例如 ArrayList),其中将包含:

[A, B, C, ... X]

我尝试了以下模式:

(.+)\\|.*\\+

但这并不像我想要的那样工作?有什么建议吗?

【问题讨论】:

    标签: java regex pattern-matching


    【解决方案1】:

    要将其转换为列表,您可以这样做:

    String name = "A|DescA+B|DescB+C|DescC+X|DescX+";
    Matcher m = Pattern.compile("([^|]+)\\|.*?\\+").matcher(name);
    List<String> matches = new ArrayList<String>();
    while (m.find()) {
        matches.add(m.group(1));
    }
    

    这会给你列表:

    [A, B, C, X]
    

    注意中间的?,这可以防止正则表达式的第二部分消耗整个字符串,因为它使* lazy 而不是 greedy.

    【讨论】:

      【解决方案2】:

      您正在使用任何字符 (.),其中包括 |,因此,解析器继续咀嚼所有内容,一旦完成任何字符,它就会查找 |,但什么都没有。

      所以,尝试匹配任何字符但是 | 像这样:

      "([^|]+)\\|.*\\+"
      

      如果合适,请确保您的所有--|在字符串的开头使用^,并且在$ 的字符串末尾有一个+:

      "^([^|]+)\\|.*\\+$"
      

      更新:Tim Pietzcker 提出了一个很好的观点:因为在找到 | 之前您已经在匹配,所以您也可以匹配字符串的其余部分并完成它:

      "^([^|]+).*\\+$"
      

      UPDATE2:顺便说一句,如果你想简单地获取字符串的第一部分,你可以简化:

      myString.split("\\|")[0]
      

      【讨论】:

      • 其实可以去掉\\|(如果字符串中至少有一个|)。
      【解决方案3】:

      另一个想法:查找+(或字符串开头)和|之间的所有字符:

      List<String> matchList = new ArrayList<String>();
      Pattern regex = Pattern.compile("(?<=^|[+])[^|]+");
      Matcher regexMatcher = regex.matcher(subjectString);
          while (regexMatcher.find()) {
              matchList.add(regexMatcher.group());
          } 
      

      【讨论】:

        【解决方案4】:

        我认为最简单的解决方案是按\\+ 拆分,然后为每个部分应用(.+?)\\|.* 模式以提取您需要的组。

        【讨论】:

        • 是的,我想过,但我还需要验证字符串是否具有这种格式......所以我想用纯正则表达式来做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        相关资源
        最近更新 更多