簡體   English   中英

正則表達式貪婪運算符的混亂和終止符

[英]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 ,測試下一個oL的匹配。 這將失敗,使其與oo匹配並測試下一個LL的匹配。 這將成功,並將返回CooL

用於匹配任一第三選擇CooLCuuL (即,與啟動的任何字符串C和結束L )將C[^L]*L 這匹配C ,然后匹配不是大寫L任意數量的字符,然后是大寫L

C.*LCooLooLCuuL相匹配,因為它很貪心。 它會在嘗試找到匹配項的同時盡其所能地咀嚼,直到匹配的字符串不再剩余以找到有效的匹配項為止。 C.*?L是非貪婪的,因此匹配CooL ,因為在找到第一個匹配項時會滿足。 它甚至會留下足夠多的字符串,無法找到第二個匹配CuuL

這是因為這是一個greedy search ,將匹配盡可能多的字符,然后回溯直到找到L字符。

這是獲取有關此問題的更多信息的好資源: http : //www.regular-expressions.info/repeat.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM