我需要Java正则表达式方面的帮助。
我的文字是这个abc abc abc xyz xyz xyz
。
我需要找到在abc
和xyz
此处应返回两个匹配项:
abc abc xyz
==> abc
和abc
之间存在xyz
abc xyz xyz
==> xyz
和abc
之间存在xyz
我的正则表达式模式:
abc\s+([a-z]*?)\s+xyz
似乎只匹配第一个匹配项abc abc xyz
。找不到abc xyz xyz
什么是适合所有人的正确模式?
答案 0 :(得分:4)
如果您只需要一个单词而不是完全匹配as you stated in the comments,则可以使用正向Lookbehind和正向Lookahead,如下所示:
(?<=abc\s)[a-z]+(?=\sxyz)
这里是demo。
如果您确实需要完全匹配,或者您希望在单词之前/之后有多个空格,则可能需要检查Andreas's answer。
答案 1 :(得分:1)
也许在匹配时需要一些修改:
public static void main(String... args) {
String s = "abc abc abc xyz xyz xyz";
Pattern pattern = Pattern.compile("(abc\\s+\\w+\\s+xyz)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1));
s = s.substring(matcher.start() + 1); // ignore the just-matched and move on;
matcher = pattern.matcher(s);
}
}
输出:
abc abc xyz
abc xyz xyz
答案 2 :(得分:1)
这是一个可以处理多个空格的正则表达式,可以告诉您在哪里找到了完全匹配项,在哪里找到了单词本身,并且不需要重置Matcher
即可继续搜索。
String input = "abc abc abc xyz xyz xyz";
Pattern p = Pattern.compile("abc(?=(\\s+([a-z]+)\\s+xyz))");
for (Matcher m = p.matcher(input); m.find(); ) {
String match = m.group() + m.group(1);
String word = m.group(2);
System.out.printf("%d-%d: %s%n", m.start(), m.end(1), match);
System.out.printf(" %d-%d: %s%n", m.start(2), m.end(2), word);
}
输出
5-18: abc abc xyz
10-13: abc
10-23: abc xyz xyz
15-18: xyz
它的工作原理是仅直接匹配前导abc
,然后将其余部分匹配为零宽度的正向超前,捕获整个超前匹配,因此可以构建“完整”匹配。这样,第二个搜索结果就可以与先前匹配的单词开始匹配。
为了获得额外的加分,它还捕获了单词本身。
然后,您可以选择是否要完全匹配,还是只想要单词。
答案 3 :(得分:-1)