2016-09-29 22 views
1
System.out.println(Pattern.matches("[amn]?", "a")); 

該語句返回true。java的量詞「?」工作?

System.out.println(Pattern.matches("[amn]?", "amn")); 

System.out.println(Pattern.matches("[amn]?", "adef")); 

這些語句返回false。

爲什麼?

我對正則表達量的理解「?」這是。

正則表達式: X?
說明: X發生一次或完全不

所以語句 「AMN]?」 「amn」應該返回true,因爲a,m,n會出現一次。 同樣在「[amn]?」 「adef」a只發生一次,m和n根本不會發生。

我哪裏錯了?

+0

匹配工作不同,然後找到。查找會工作。 – Antoniossss

回答

2

正則表達式[amn]?匹配由a,mn組成的任何字符串,而不是其他任何字符串。如"a",滿足這個條件。

amnadef,然而,從這些字母之一開始,但是繼續,以致「一次或根本不」滿足規則。

+0

嗨..我已經添加了一個代碼片段,這是工作。有什麼區別? –

+0

@AmberBeriwal glglgl是正確的,但'?'部分意味着可以有零個或多個匹配的a,m,n,這意味着無論您給這個正則表達式輸入什麼樣的輸入都可以無限次地進行,而無需檢查任何內容。這裏使用沒有意義。 –

+1

?意思是**最多1 **。你描述的行爲由'*'(星號)表示。所以2次出現無法滿足「最多1條」規則 – Antoniossss

1

第一個返回true,因爲a是一個字母,可以是a,m或n。

其他人返回假,因爲沒有一個字母,有3和4個字母。

即使您的信件組包含3個字母,它也只會檢查是否存在其中一個

0

?表示匹配當前正則表達式不貪

1

功能matches()針對正則表達式,這意味着它將返回true僅當完整的字符串可以由表達式,而不是任何亞序列被匹配的整個字符串匹配。請參閱this documentation

[amn]?表示a或m或n可以存在一次或根本不存在。只有情況下爲其matches()將返回true

  1. 「一」
  2. 「M」
  3. 「N」
  4. 「」

所有其他情況下將作爲錯誤的。

如果您想在某些字符串中找到正則表達式,請使用find(),如下所示。

Pattern p = Pattern.compile("[amn]?"); 
    Matcher mat = p.matcher(""); //pass amn or adef 
    boolean matches = false; 
    while(mat.find()){ 
     matches = true; 
     break; 
    } 
    System.out.println(matches); 
+1

'matches()'和'find()'是兩個非常不同的函數。 – rorschach

1

[amn]是由字符「a」,「m」和「n」組成的組。 [amn]?表示「來自組[amn]的字符之一或根本沒有字符」。

Pattern.matches試圖將整個模式與整個輸入字符串進行匹配。

如果你想要字符序列「amn」,你可以嘗試(amn)?,這應該意味着「序列」amn「或什麼都不是」。