我有一个字符串,例如:
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;问候
答案 0 :(得分:2)
您可以使用Positive Lookahead来捕捉重叠的匹配。
Pattern p = Pattern.compile("(?s)(?=(i.*?structure))");
前瞻不会“消耗”字符串上的任何字符。
展望未来之后,正则表达式引擎返回到它开始查看的字符串上的相同位置。从那里,它可以再次开始匹配......
注意: *
是greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。您希望使用*?
代替非贪婪匹配,意思是“零或更多 - 最好尽可能少”。