Java 正则表达式以查找所有匹配项
我需要一个正则表达式来查找我的模式的所有匹配项 文本是这样的:Java 正则表达式以查找所有匹配项,java,regex,Java,Regex,我需要一个正则表达式来查找我的模式的所有匹配项 文本是这样的: "someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text" Pattern pattern = Pattern.compile("!style_delete\\s*\\[.*\\]"); !style_delete [company code : 43
"someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"
Pattern pattern = Pattern.compile("!style_delete\\s*\\[.*\\]");
!style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9]
我想找到该模式的所有匹配项:
!style_delete [.*]
我试过这样做:
"someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"
Pattern pattern = Pattern.compile("!style_delete\\s*\\[.*\\]");
!style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9]
这样,匹配文本如下所示:
"someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"
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中的正则表达式将获得什么样的输出。这是因为
*
是贪婪的。改用这个:
"!style_delete\\s*\\[[^\\]]*\\]"
这意味着:匹配括号中的所有内容,不包括结束语]
或者将[]
之间的内容设置为非贪婪:
"!style_delete\\s*\\[.*?\\]"
您需要使用匹配:
start.*?end
在您的情况下,模式是:
!style_delete\\s\\[(.*?)\\] (Even simple to understand than first version :))
证明(Java 7):
链接到证明:@Test
公开无效测试(){
final String input=“someother text!style_delete[company code:43ev4]在文本之间!style_delete[organization:0asj9]行尾文本”;
//my regexp:强文本
//最后一个字符串regex=“(!style\u delete\\s\\[[a-zA-Z0-9\\s:][*\\])”;
//来自Trinmon的regexp:
最后一个字符串regex=“(!style\u delete\\s*\[^\\]]*\\])”;
final Matcher m=Pattern.compile(regex.Matcher)(输入);
最终列表匹配项=新的ArrayList();
while(m.find()){
匹配。添加(m.group(0));
}
assertEquals(2,matches.size());
assertEquals(“匹配1:”,匹配.get(0),“!style_delete[公司代码:43ev4]”;
assertEquals(“匹配2:”,匹配.get(1),“!style_delete[Organization:0asj9]”;
}
编辑
也许特里尼蒙回答的模式更优雅一点。我用他的正则表达式更新了正则表达式。您能提供一个您试图匹配的文本示例吗?您可以用
[^]]*
替换括号中的*
。这将匹配方括号内的所有内容,而不是右方括号,这样您就不会意外地消耗太多。要尝试您的regexp模式,您可以始终使用一些在线regexp测试仪(google“online regexp”提供一些)。我经常使用一个正则表达式,它必须在正斜杠之间,比如/regexp*/