本以爲自己雖然並沒有特別精通正則表達式,但是基本的用法還是沒有問題.但是最近遇到一個問題還是讓我捉襟見肘,在此感謝大牛哥的指導.
首先我們大致瞭解一下正則表達式.
元字符:
. 任意字符
^ 行首
$ 行尾
+ 一到多個緊跟在其前面的字符的個數
? 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的字段.顯然這裏面只有一行是滿足要求的.
最初的正則表達式:
/<animal .*name=".\{-}"\s\/>
本以爲這這個表達式可以,沒想到結果卻是這樣的.
這個結果的確讓人始料未及.我使用了是貪婪匹配.不應該僅僅匹配第二行纔對嘛.
其實這裏存在一個問題.正則表達式的原則是匹配.所有其它原則都是建立在這個基礎上面的.所以我們可以看一下第三是否匹配.答案是匹配.且僅有這一種匹配情形.
既然只有一種匹配情形,就談不上非貪婪了.所謂非貪婪,是建立在匹配的基礎上面的.
明確了問題,我們想想該怎麼解決這個問題呢.
/<animal.*name="[^"]\{-}" \/>
使用上面這段作爲正則表達式進行匹配,就可以達到預期的目的.因爲限定了""之間最短匹配的內容之中不能有"
這一次對於正則表達式的使用經歷還是之前沒有過的.完全不懂得怎麼分析這個問題,不過好在得到了前輩的指導.不僅解決了這個問題.也理解了這個問題.希望這篇心得可以幫助到你.