【问题标题】:Java Regexp GroupsJava 正则表达式组
【发布时间】:2012-01-23 10:38:54
【问题描述】:

我需要一个表达式来提取一些替代方案。输入是:

asd11sdf33sdf55sdfg77sdf

我需要 11 33 和 55 但不是 77。

我先试了:

.*(((11)|(33)|(55)).*)+.*

所以我只得到了 55。但是懒惰(不贪心)

.*?(((11)|(33)|(55)).*)+.*

我只有 11 个。如何获得全部?

问候托马斯

【问题讨论】:

  • 您的要求不清楚。您是否要断言字符串中存在 11、33 和 55,但不存在 77?数字的顺序是否相关?你到底想达到什么目标?
  • 我想要全部 11 或 33 或 55。在 aa33ss33dd33ee 我需要 3 次 33
  • 我使用:Pattern p = Pattern.compile("(11|33|55)");匹配器 m = p.matcher("asd11sdf33sdf55sdfg77sdf");整数开始 = 0; List 匹配 = new ArrayList(); while (m.find()) {matches.add(m.group()); } System.err.println("matches = " + 匹配);

标签: java regex find matcher regex-greedy


【解决方案1】:

(?!77)(\d\d) 用作Patternwhile (m.find()) { m.group(1) },其中mMatcher

【讨论】:

  • 这会找到任何两位数,而不仅仅是 11、33 或 55(尽管我不清楚 @tricpod 需要什么正则表达式)。
  • 哦,我的问题不够精确。 11 33 55 只是一个例子。
  • 那么这是正确的解决方案。 +1 今天最好使用水晶球。
【解决方案2】:

组是固定的,您不能在组上使用“+”来获取匹配列表。您必须使用循环来执行此操作:

    Pattern p = Pattern.compile("((11)|(33)|(55))");
    Matcher m = p.matcher("asd11sdf33sdf55sdfg77sdf");
    int start = 0;
    List<String> matches = new ArrayList<String>();
    while (m.find()) {
        matches.add(m.group());
    }
    System.err.println("matches = " + matches);

【讨论】:

    【解决方案3】:

    尝试使用

    .*?(11|33|55)
    

    作为您的正则表达式来编译模式,并在 fge 的答案中使用循环。 (而且我认为他的回答更普遍、更有意义……

    这是因为 .* 或正则表达式中 (11|33|55) 之后的内容匹配 11 之后的整个字符串。(如果您使用贪婪匹配,则 (11|33|55) 之前的 .* 将匹配55之前的整个字符串......只是因为它很贪心)

    这样你会得到一个 match(1) 为 11 的 match,find() 是 11 之后的 string 的 match。

    http://www.regexplanet.com/simple/index.html测试

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2016-09-28
      • 2013-01-18
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多