個人理解Regex——懶惰匹配,Regex匹配_PHP教程

來源:互聯網
上載者:User

個人理解Regex——懶惰匹配,Regex匹配


問題描述

本文連結:http://www.hcoding.com/?p=130

初學Regex的時候都有一個疑問,例如:需要匹配串 "_abc_123_" 中 第一對"_"之間的字元,剛開始學習Regex的時候會寫成 "/_\w*_/",匹配的結果就是"abc_123" 而不是"abc"了;大神說加上一個問號,"/_\w*?_/",這時候匹配的結果就是"abc"。

我們知道'?'單獨使用的時候表示:重複零次或一次,而當'?'出現在重複限定符後面的,起的作用就是懶惰匹配,也就是匹配儘可能少的字元。懶惰限定符說明:

  • *?:重複任意次,但儘可能少重複
  • +?:重複1次或更多次,但儘可能少重複
  • ??:重複0次或1次,但儘可能少重複
  • {n,m}?:重複n到m次,但儘可能少重複
  • {n,}?:重複n次以上,但儘可能少重複

對的,“儘可能少重複”,這就是對懶惰匹配的粗暴直白的解說。

那麼怎麼理解“儘可能少重複”呢?我們可以從Regex的忽略優先量詞來解釋了。

忽略優先量詞

量詞"*?"、"+?"、"??"、"{n,m}?"、"{n,}?"都屬於忽略優先量詞,忽略優先量詞使用的是在?、+、*、{}後面添加?組成的,忽略優先在匹配的時候首先會嘗試忽略,如果失敗後回溯才會選擇嘗試。比如`ab??`匹配“abb”會得到‘a’而不是“ab”。當引擎匹配成功a後,由於是忽略優先,引擎首先選擇不匹配b,繼續查看錶達式,發現運算式結束了,那麼引擎就直接上報匹配成功。具體我們通過下面的例子一步一步說明忽略優先量詞工作原理。

例子

還是上面的例子,用"/_\w*?_/"匹配"_abc_123_" 中 第一對"_"之間的字元。

開始匹配第一個'_'之後,‘\w*?’首先決定不需要匹配任何字元,因為它是忽略優先量詞,這時候就拿運算式'/_\w*?_/'中的第二個'_'('\w*?'後面的'_')和目標串'_abc_123_'中的'a'匹配,匹配失敗,這時候才會拿'\w*?'去嘗試未匹配的分支(使用\w匹配a,嘗試匹配a成功)

下一步,是嘗試匹配,還是忽略呢?因為'\w*?'是忽略優先量詞,會選擇忽略,那麼就是重複上一步,'_'匹配b失敗,'\w*?'去嘗試未匹配的分支ab,以上步驟總共重複了3次後(直到運算式'\w*?'後面的'_'和目標串第二個'_'匹配),最終匹配出'abc'。

過程(開始匹配第一個'_'之後):

  • 運算式/_\w*?_/'中的第二個'_'和目標串'_abc_123_'中的'a'匹配,匹配失敗,'\w*?'嘗試匹配目標串'_abc_123_'中的'a',匹配成功。
  • 運算式/_\w*?_/'中的第二個'_'和目標串'_abc_123_'中的'b'匹配,匹配失敗,'\w*?'嘗試匹配目標串'_abc_123_'中的'ab',匹配成功。
  • 運算式/_\w*?_/'中的第二個'_'和目標串'_abc_123_'中的'c'匹配,匹配失敗,'\w*?'嘗試匹配目標串'_abc_123_'中的'abc',匹配成功。
  • 運算式/_\w*?_/'中的第二個'_'和目標串'_abc_123_'中的'_'匹配,匹配成功,匹配結束。結果為abc。

以上是閱讀《精通Regex》關於忽略優先量詞一節的想法,如有不對虛心接受各位的指教,謝謝!

本文連結:http://www.hcoding.com/?p=130

原創文章,轉載請註明:JC&hcoding.com

http://www.bkjia.com/PHPjc/921718.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/921718.htmlTechArticle個人理解Regex——懶惰匹配,Regex匹配 問題描述 本文連結:http://www.hcoding.com/?p=130 初學Regex的時候都有一個疑問,例...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.