簡體   English   中英

Java-正則表達式-查找所有匹配項

[英]Java - regex - find all matches

我需要Java正則表達式方面的幫助。

我的文字是abc abc abc xyz xyz xyz 我需要找到abcxyz之間只有一個單詞的所有匹配項

這是應該返回的兩個匹配項:

  1. abc abc xyz ==> abcxyz之間存在一個abc
  2. abc xyz xyz ==>的xyz是之間存在abcxyz

我的正則表達式模式:

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進行工作,然后以零寬度的正向提前匹配其余部分,捕獲整個提前匹配,因此可以構建“完整”匹配。 這允許第二個搜索結果開始與先前匹配的單詞匹配。

為了獲得額外的獎勵積分,它還捕獲了單詞本身。

然后,您可以選擇是否要完全匹配,還是只想要單詞。

您忘記了定界符並重復了內部元素。 這是在線演示鏈接

^abc\s+(?:([a-z]*?)\s+)+?xyz$

並使內部元素查找器不再貪婪

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM