Regex(vim版)非貪婪匹配釋疑__Regex

來源:互聯網
上載者:User

本以為自己雖然並沒有特別精通Regex,但是基本的用法還是沒有問題.但是最近遇到一個問題還是讓我捉襟見肘,在此感謝大牛哥的指導.

首先我們大致瞭解一下Regex.

元字元:

.   任一字元

^   行首

$   行尾

+   一到多個緊跟在其前面的字元的個數

?   0到1個緊跟其前面的字元

*   0到多個緊跟其前面的字元

{}   緊跟其前面的字元的個數,可選方式有.{N}, {N,M}, {N,},分別表示出現N次,出現N到M次,出現N到多次.

OK,有了上面的這個簡要說明,下面的問題就不難理解了.

情景複現,首先看一下源檔案大致的布局:

<animals exp="bird">  <animal fly="1" swim="1" name="3" />  <animal fly="1" swim="1" name="3" cmdid=""/>  <animal fly="1" swim="1" name="1" cmdid=""/></animals>
在這段代碼中,我想要animal中找到不含cmdid的欄位.顯然這裡面只有一行是滿足要求的.

最初的Regex:

/<animal .*name=".\{-}"\s\/>
本以為這這個運算式可以,沒想到結果卻是這樣的.

這個結果的確讓人始料未及.我使用了是貪婪匹配.不應該僅僅匹配第二行才對嘛.

其實這裡存在一個問題.Regex的原則是匹配.所有其它原則都是建立在這個基礎上面的.所以我們可以看一下第三是否匹配.答案是匹配.且僅有這一種匹配情形.

既然只有一種匹配情形,就談不上非貪婪了.所謂非貪婪,是建立在匹配的基礎上面的.

明確了問題,我們想想該怎麼解決這個問題呢.

/<animal.*name="[^"]\{-}" \/>
使用上面這段作為Regex進行匹配,就可以達到預期的目的.因為限定了""之間最短匹配的內容之中不能有"

這一次對於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.