正则表达式查找所有匹配项

Ran*_*ith 2 java regex

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

文本是这样的:

"someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"
Run Code Online (Sandbox Code Playgroud)

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

!style_delete [.*]
Run Code Online (Sandbox Code Playgroud)

我已经这样尝试过:

Pattern pattern = Pattern.compile("!style_delete\\s*\\[.*\\]");
Run Code Online (Sandbox Code Playgroud)

与此匹配的文本是这样的:

!style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9]
Run Code Online (Sandbox Code Playgroud)

但我期望如下:

match 1 : !style_delete [company code : 43ev4] 
match 2 : !style_delete [organiztion : 0asj9]
Run Code Online (Sandbox Code Playgroud)

请帮帮我,java中的正则表达式将如何获得上述输出。

Ste*_*erg 7

@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]");
}
Run Code Online (Sandbox Code Playgroud)

编辑

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


Gui*_*ume 5

您需要使用非贪婪匹配:

start.*?end
Run Code Online (Sandbox Code Playgroud)

在你的情况下,模式是:

!style_delete\\s\\[(.*?)\\] (Even simple to understand than first version :))
Run Code Online (Sandbox Code Playgroud)

证明(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());
}
Run Code Online (Sandbox Code Playgroud)

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