2011-04-15 77 views
0

我有一個我想匹配的Java模式。我想把我的初始模式匹配到它的第一個匹配項。但是,我認爲模式問題

public static void main(String[] args) 
    { 
     final String expression = "(\\s*(a{1}\\s*b{1})\\s*)"; 

     Scanner scanner1 = new Scanner(" ab"); 
     //should be rejected 
     Scanner scanner2 = new Scanner("cab"); 

     System.out.println(scanner1.findWithinHorizon(expression, 0)); 
     System.out.println(scanner2.findWithinHorizon(expression, 0)); 
    } 

當我運行上面的代碼,我得到以下的輸出:

ab 
ab 

我試圖修改使用不願意和佔有慾量詞的模式,但也好像產生我期望的結果。我在這裏做錯了什麼?

+1

'{1}'是多餘的:它們可以安全省略。 – 2011-04-15 11:20:52

+0

@Bart Kiers感謝您的提示。我在這方面還是有點新的。 – LandonSchropp 2011-04-15 11:36:37

回答

1

我假設你想只匹配「AB」,而不是「駕駛室」或「c AB」,所以用這個正則表達式在字符串的開頭開始:如果你也想匹配「final String expression = "^(\\s*(a{1}\\s*b{1})\\s*)";

c ab「而不是」cab「試試這個:final String expression = "((?<!\\w)\\s*(a{1}\\s*b{1})\\s*)";

+0

嗯,我認爲第一個完全符合我的要求,但請你解釋它是如何工作的?感謝您的快速回復。 – LandonSchropp 2011-04-15 11:42:29

+0

它基本上是你的表達式,前面還有^字符,這意味着匹配必須從字符串的開頭開始。因此,如果字符串以除空格或'a'之外的任何字符開頭,它將不匹配。第二個表達式只是說在第一個'a'之前不能有任何字符。 – Thomas 2011-04-15 12:00:30

+0

正則表達式的一個很好的網站可以在這裏找到:http://www.regular-expressions.info/ – Thomas 2011-04-15 12:01:35