正则表达式查找所有匹配结果

3
我需要一个正则表达式来查找我的模式的所有匹配项。
文本大致如下:
"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中的正则表达式应该怎样才能得到上述输出结果。

请问您能否提供一个您想要匹配的文本示例? - David
你可以用[^]]*替换方括号中的.*。这将匹配方括号内的所有内容,而不是右方括号,以免意外消耗太多内容。 - FriedSaucePots
为了尝试您的正则表达式模式,您可以随时使用一些在线正则表达式测试工具(谷歌搜索“在线正则表达式”即可找到几个)。我经常使用https://regex101.com。 - Benoît
一个正则表达式必须放在斜杠之间,例如/regexp*/。 - Arif Burhan
3个回答

13
@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答案中的模式更加优雅。我使用了他的正则表达式更新了正则表达式。


5

您需要使用非贪婪匹配

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());
}

Link to proof : http://ideone.com/Qtymb3


3

这是因为 .* 是贪婪的。使用下面这个代替:

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

这意味着:匹配方括号内除闭合符]外的所有内容。

或者将方括号[]内的内容设置为非贪婪模式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接