使用常规和正则表达式查找所有可能的事件

时间:2015-03-09 22:40:47

标签: java regex string

我有一个字符串,例如:

i installed apache2 and when i transfered the httpd.conf to the new structure

我正在尝试查找正则表达式i.*structure

的所有匹配项

我的代码看起来像这样

List<String> matches = new ArrayList<>();
Pattern p = Pattern.compile("i.*structure", Pattern.MULTILINE|Pattern.DOTALL);
Matcher m = p.matcher(text);
while (m.find()) {
  matches.add(m.group());
}
System.out.println(matches);

最后一行输出以下内容:

[i installed apache2 and when i transfered the httpd.conf to the new structure]

我的期望是:

[i installed apache2 and when i transfered the httpd.conf to the new structure, 
 installed apache2 and when i transfered the httpd.conf to the new structure, 
 i transfered the httpd.conf to the new structure]

任何人都可以向我解释我做错了吗?

谢谢&amp;问候

1 个答案:

答案 0 :(得分:2)

您可以使用Positive Lookahead来捕捉重叠的匹配。

Pattern p = Pattern.compile("(?s)(?=(i.*?structure))");

前瞻不会“消耗”字符串上的任何字符。

展望未来之后,正则表达式引擎返回到它开始查看的字符串上的相同位置。从那里,它可以再次开始匹配......

注意: *greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。您希望使用*?代替非贪婪匹配,意思是“零或更多 - 最好尽可能少”。

Ideone Demo