【问题标题】:Regex to find all matches [duplicate]正则表达式查找所有匹配项[重复]
【发布时间】:2015-12-26 02:37:54
【问题描述】:

我需要一个正则表达式来查找我的模式的所有匹配项。

文字是这样的:

"someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"

我想找到该模式的所有匹配项:

!style_delete [.*]

我试过这样:

Pattern pattern = Pattern.compile("!style_delete\\s*\\[.*\\]");

有了这个匹配文本是这样的:

!style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9]

但我预计如下:

match 1 : !style_delete [company code : 43ev4] 
match 2 : !style_delete [organiztion : 0asj9]

请帮帮我,java 中的正则表达式会得到什么输出。

【问题讨论】:

  • 能否提供一个您尝试匹配的文本示例?
  • 您可以将括号中的.* 替换为[^]]*。这将匹配方括号内的所有内容而不是右方括号,因此您不会意外消耗太多。
  • 要尝试您的正则表达式模式,您可以随时使用一些在线正则表达式测试器(谷歌“在线正则表达式”有一些)。我经常使用regex101.com
  • 正则表达式必须在正斜杠之间,例如 /regexp*/

标签: java regex


【解决方案1】:
@Test
public void test() {
    final String input = "someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text";
    // my regexp:strong text
    // final String regex = "(!style_delete\\s\\[[a-zA-Z0-9\\s:]*\\])";
    // regexp from Trinmon:
    final String regex = "(!style_delete\\s*\\[[^\\]]*\\])";

    final Matcher m = Pattern.compile(regex).matcher(input);

    final List<String> matches = new ArrayList<>();
    while (m.find()) {
        matches.add(m.group(0));
    }

    assertEquals(2, matches.size());
    assertEquals("match 1: ", matches.get(0), "!style_delete [company code : 43ev4]");
    assertEquals("match 2: ", matches.get(1), "!style_delete [organiztion : 0asj9]");
}

编辑

也许 Trinimon 的答案中的模式更优雅一些。我用他的正则表达式更新了正则表达式。

【讨论】:

    【解决方案2】:

    你需要使用non-greedy匹配:

    start.*?end
    

    在你的情况下,模式是:

    !style_delete\\s\\[(.*?)\\] (Even simple to understand than first version :))
    

    证明(Java 7):

    String string = "someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"; 
    Pattern pattern = Pattern.compile("!style_delete\\s\\[(.*?)\\]");
    Matcher matcher = pattern.matcher(string) ;
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
    

    证明链接:http://ideone.com/Qtymb3

    【讨论】:

      【解决方案3】:

      这是因为.* 是贪婪的。改用这个:

      "!style_delete\\s*\\[[^\\]]*\\]"
      

      这意味着:匹配括号中的所有内容,不包括结束 ]

      或者使[]之间的内容不贪婪:

      "!style_delete\\s*\\[.*?\\]"
      

      【讨论】:

        猜你喜欢
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多