[英]Confusion over Regex greedy operator, and terminating character
我正在為SCJP考試學習,以下模擬問題使我措手不及。 該工具中的解釋不是很好,所以我希望SO的知識淵博的人可以對其進行解釋。
使用C.*L
的正則表達式,確定它將從CooLooLCuuLooC
捕獲的CooLooLCuuLooC
我選擇了CooL and CuuL
。 我之所以選擇該選項,是因為我相信它會尋找C的開始匹配項,然后將任何字符零次或更多次,直到找到L
,然后終止。
但是,答案實際上是CooLooLCuuL
。 我對前兩個L
如何通過感到困惑?
有人可以幫我清理一下嗎?
謝謝
只是一個可能有用的解釋:
.*
匹配任何內容(默認情況下為換行符!!!),零次或多次-您通常都可以理解。 但是, .*?
也符合該定義。 區別在於貪婪...
.*
將匹配所有內容,直到無法匹配其他任何內容(“貪婪”或“渴望”) .*?
將匹配任何內容,直到可以匹配以下表達式(“非貪婪”或“勉強”) 因此, C.*L
將找到大寫ooLooLCuuLooC
C
,然后將ooLooLCuuLooC
與.*
進行匹配。 然后它將發現它必須匹配大寫L
在字符串的末尾,這是不可能的,因此它轉到可以匹配L
,從而迫使.*
放棄字符LooC
來這樣做。 結果: CooLooLCuuL
如果使用C.*?L
,它將找到C
,然后匹配o
,測試下一個o
與L
的匹配。 這將失敗,使其與oo
匹配並測試下一個L
與L
的匹配。 這將成功,並將返回CooL
。
用於匹配任一第三選擇CooL
或CuuL
(即,與啟動的任何字符串C
和結束L
)將C[^L]*L
。 這匹配C
,然后匹配不是大寫L
任意數量的字符,然后是大寫L
C.*L
與CooLooLCuuL
相匹配,因為它很貪心。 它會在嘗試找到匹配項的同時盡其所能地咀嚼,直到匹配的字符串不再剩余以找到有效的匹配項為止。 C.*?L
是非貪婪的,因此匹配CooL
,因為在找到第一個匹配項時會滿足。 它甚至會留下足夠多的字符串,無法找到第二個匹配CuuL
。
這是因為這是一個greedy search
,將匹配盡可能多的字符,然后回溯直到找到L
字符。
這是獲取有關此問題的更多信息的好資源: http : //www.regular-expressions.info/repeat.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.