2011-11-22 13 views
2

我正在學習SCJP考試,下面的模擬問題引起了我的注意。該工具中的解釋並不是很好,所以我希望SO的知識淵博的人能夠解釋它。關於正則表達式貪婪算子的混亂,並終止字符

隨着C.*L正則表達式,確定從CooLooLCuuLooC

我選擇CooL and CuuL將捕捉的話。我之所以選擇這個選擇是因爲我相信它會尋找C的開始匹配,然後將任何字符零次或多次直到找到一個L,然後終止。

但是,答案實際上是CooLooLCuuL。我很困惑第一個2 L是如何完成的?

任何人都可以請爲我清除這個?

感謝

+2

你寫了同樣的答案兩次... – OrangeDog

+0

對不起,現在已經修復:) – Jimmy

回答

3

只要再一個可能有用的解釋:

.*匹配任何東西(除了默認情況下,換行!!!!),零或更多次 - 你通常理解這一點。但是,.*?也符合該定義。所不同的是貪婪...

  • .*直到不​​能匹配任何東西都不會匹配任何東西(「貪婪」或「渴望」)
  • .*?將匹配任何東西,直到下面的表達式可以匹配(」非貪婪」或 '不願意')

因此,C.*L會發現資本C,然後用.*匹配ooLooLCuuLooC。它會發現它必須匹配首都L。在字符串末尾,這是不可能的,所以它會到達與L匹配的位置,迫使.*放棄字符LooC以便這樣做。結果:CooLooLCuuL

如果你使用C.*?L它會找到C,再搭配o,測試了比賽的下一個oL。這會失敗,使其匹配oo並測試下一個LL匹配。這會成功,它會返回CooL

匹配任一CooLCuuL第三個選項(即,與C開始和結束L任何字符串)將是C[^L]*L。這與C匹配,然後是不是大寫字母L,然後是大寫字母L的任意數量的字符。

+0

爲什麼C。*?L也會匹配Cuul?!它看起來會。 – despot

+1

@despot - 不完全是_sure_你的問題是什麼,但是如果你的問題是「會」,那麼除了任何拼寫錯誤,'Cuul'不會被匹配,因爲它以'l'結尾(小寫字母el)除了'CooL'之外,*'L'匹配'CuuL'「,那麼答案是」是的,如果它以超過第一個匹配'CooL'的方式運行;例如,使用'matchAll ()'鍵入函數或在找到'CooL'匹配後重新開始搜索,可能從索引4+開始「。順便說一句,它也會匹配'C - L','CqwERtyL',甚至是'C%@((*&^ $%L' –

+0

抱歉,錯字 - 「會」應該是「不會」。 – despot

2

C.*L匹配CooLooLCuuL因爲它是貪婪的。它會嘗試咀嚼儘可能多的東西,同時仍然會找到一個匹配,直到找不到匹配的字符串的剩餘部分以找到有效匹配爲止。 C.*?L非貪婪,因此匹配CooL,因爲在找到第一個匹配項時它會被滿足。它甚至會留下足夠的字符串,以便找到第二場比賽CuuL