2016-03-03 44 views
2

我試圖找到一個更小的字符串,String patternString1 = "(John) (.+?)";,一個更大的字符串中。較小的字符串由兩組組成,即(John) (.+?)。不過,我只是在(.+?)之後增加一個空格而獲得完全不同的結果。爲什麼加入`後的空間(。+?)`可以徹底改變的結果

String patternString1 = "(John) (.+?)";(即無空格),結果是

found: John w 
found: John D 
found: John W 

對於String patternString1 = "(John) (.+?) ";,(即空間),結果是

found: John writes 
found: John Doe 
found: John Wayne 

怎麼來的空間可以作出這樣的結果有很大差異?

String text 
     = "John writes about this, and John Doe writes about that," 
     + " and John Wayne writes about everything."; 

String patternString1 = "(John) (.+?)"; 
Pattern pattern = Pattern.compile(patternString1); 
Matcher matcher = pattern.matcher(text); 

while (matcher.find()) { 
    System.out.println("found: " + matcher.group(1) + " " + matcher.group(2)); 
} 

回答

2

.+?量詞是不願(或 「懶惰」)。這意味着它將匹配一次或多次量化的子模式,但是必要的次數以返回有效匹配

你有(John) (.+?)模式,並嘗試找到匹配的John writes about this。正則表達式引擎找到John,將其放入組1內存緩衝區,找到一個空間,將其匹配,然後在writes中找到ww匹配,所以滿足的一個或多個的要求。由於匹配已經有效,所以返回。你得到John w。現在

,你(.+?)後添加一個空格。 John與之前匹配並捕獲到組1中,該空間與該模式中的空間匹配(與之前一樣),然後執行.+? - 在writes之前發現空位置。它匹配這個位置並繼續匹配空間。該位置沒有空間,因爲有w。正則表達式引擎返回.+?並消耗w。檢查r是否爲空格 - 否,不是。引擎以這種方式檢查字符串直到第一個匹配空間,並在writes之後發現它。因此,您的(John) (.+?)的有效匹配爲John writes

1

那麼,如果你包含尾隨空格,你就是要求模式匹配那個空間。

John w不匹配了,因爲它不以空格結尾。

它必須被擴展到John writes(注意,匹配包括在末端的空間)。

相關問題