[英]Java - regex - find all matches
我需要Java正則表達式方面的幫助。
我的文字是abc abc abc xyz xyz xyz
。 我需要找到在abc
和xyz
之間只有一個單詞的所有匹配項
這是應該返回的兩個匹配項:
abc abc xyz
==> abc
和xyz
之間存在一個abc
abc xyz xyz
==>的xyz
是之間存在abc
和xyz
我的正則表達式模式:
abc\s+([a-z]*?)\s+xyz
似乎只匹配第一個匹配項abc abc xyz
。 找不到abc xyz xyz
什么是適合所有人的正確模式?
如果您只需要一個單詞,而不是注釋中所述的完全匹配,則可以使用正向Lookbehind和正向Lookahead,如下所示:
(?<=abc\s)[a-z]+(?=\sxyz)
這是一個演示 。
如果您確實需要完全匹配,或者期望在單詞前后有多個空格,則可能需要檢查Andreas的答案 。
匹配時可能需要一些修改:
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
這是一個可處理多個空格的正則表達式,可以告訴您在哪里找到了完全匹配項,在哪里找到了單詞本身,並且不需要重置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
進行工作,然后以零寬度的正向提前匹配其余部分,捕獲整個提前匹配,因此可以構建“完整”匹配。 這允許第二個搜索結果開始與先前匹配的單詞匹配。
為了獲得額外的獎勵積分,它還捕獲了單詞本身。
然后,您可以選擇是否要完全匹配,還是只想要單詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.