久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      正則表達(dá)式詳細(xì)介紹(下)

      本文是前一片文章《正則表達(dá)式詳細(xì)介紹(上)》的續(xù)篇,在本文中講述了正則表達(dá)式中的組與向后引用,先前向后查看,條件測(cè)試,單詞邊界,選擇符等表達(dá)式及例子,并分析了正則引擎在執(zhí)行匹配時(shí)的內(nèi)部機(jī)理。
      9. 單詞邊界

      元字符<<b>>也是一種對(duì)位置進(jìn)行匹配的“錨”。這種匹配是0長(zhǎng)度匹配。

      4種位置被認(rèn)為是“單詞邊界”:

      1) 在字符串的第一個(gè)字符前的位置(如果字符串的第一個(gè)字符是一個(gè)“單詞字符”)

      2) 在字符串的最后一個(gè)字符后的位置(如果字符串的最后一個(gè)字符是一個(gè)“單詞字符”)

      3) 在一個(gè)“單詞字符”和“非單詞字符”之間,其中“非單詞字符”緊跟在“單詞字符”之后

      4) 在一個(gè)“非單詞字符”和“單詞字符”之間,其中“單詞字符”緊跟在“非單詞字符”后面

      “單詞字符”是可以用“w”匹配的字符,“非單詞字符”是可以用“W”匹配的字符。在大多數(shù)的正則表達(dá)式實(shí)現(xiàn)中,“單詞字符”通常包括<<[a-zA-Z0-9_]>>。

      例如:<<b4b>>能夠匹配單個(gè)的4而不是一個(gè)更大數(shù)的一部分。這個(gè)正則表達(dá)式不會(huì)匹配“44”中的4。

      換種說(shuō)法,幾乎可以說(shuō)<<b>>匹配一個(gè)“字母數(shù)字序列”的開(kāi)始和結(jié)束的位置。

      “單詞邊界”的取反集為<<B>>,他要匹配的位置是兩個(gè)“單詞字符”之間或者兩個(gè)“非單詞字符”之間的位置。

      深入正則表達(dá)式引擎內(nèi)部

      讓我們看看把正則表達(dá)式<<bisb>>應(yīng)用到字符串“This island is beautiful”。引擎先處理符號(hào)<<b>>。因?yàn)閎是0長(zhǎng)度 ,所以第一個(gè)字符T前面的位置會(huì)被考察。因?yàn)門是一個(gè)“單詞字符”,而它前面的字符是一個(gè)空字符(void),所以b匹配了單詞邊界。接著<<i>>和第一個(gè)字符“T”匹配失敗。匹配過(guò)程繼續(xù)進(jìn)行,直到第五個(gè)空格符,和第四個(gè)字符“s”之間又匹配了<<b>>。

      然而空格符和<<i>>不匹配。繼續(xù)向后,到了第六個(gè)字符“i”,和第五個(gè)空格字符之間匹配了<<b>>,然后<<is>>和第六、第七個(gè)字符都匹配了。然而第八個(gè)字符和第二個(gè)“單詞邊界”不匹配,所以匹配又失敗了。到了第13個(gè)字符i,因?yàn)楹颓懊嬉粋€(gè)空格符形成“單詞邊界”,同時(shí)<<is>>和“is”匹配。引擎接著嘗試匹配第二個(gè)<<b>>。因?yàn)榈?5個(gè)空格符和“s”形成單詞邊界,所以匹配成功。引擎“急著”返回成功匹配的結(jié)果。

      10. 選擇符

      正則表達(dá)式中“|”表示選擇。你可以用選擇符匹配多個(gè)可能的正則表達(dá)式中的一個(gè)。

      如果你想搜索文字“cat”或“dog”,你可以用<<cat|dog>>。如果你想有更多的選擇,你只要擴(kuò)展列表<<cat|dog|mouse|fish>>。

      選擇符在正則表達(dá)式中具有最低的優(yōu)先級(jí),也就是說(shuō),它告訴引擎要么匹配選擇符左邊的所有表達(dá)式,要么匹配右邊的所有表達(dá)式。你也可以用圓括號(hào)來(lái)限制選擇符的作用范圍。如<<b(cat|dog)b>>,這樣告訴正則引擎把(cat|dog)當(dāng)成一個(gè)正則表達(dá)式單位來(lái)處理。

      注意正則引擎的“急于表功”性

      正則引擎是急切的,當(dāng)它找到一個(gè)有效的匹配時(shí),它會(huì)停止搜索。因此在一定條件下,選擇符兩邊的表達(dá)式的順序?qū)Y(jié)果會(huì)有影響。假設(shè)你想用正則表達(dá)式搜索一個(gè)編程語(yǔ)言的函數(shù)列表:Get,GetValue,Set或SetValue。一個(gè)明顯的解決方案是<<Get|GetValue|Set|SetValue>>。讓我們看看當(dāng)搜索SetValue時(shí)的結(jié)果。

      因?yàn)?lt;<Get>>和<<GetValue>>都失敗了,而<<Set>>匹配成功。因?yàn)檎齽t導(dǎo)向的引擎都是“急切”的,所以它會(huì)返回第一個(gè)成功的匹配,就是“Set”,而不去繼續(xù)搜索是否有其他更好的匹配。

      和我們期望的相反,正則表達(dá)式并沒(méi)有匹配整個(gè)字符串。有幾種可能的解決辦法。一是考慮到正則引擎的“急切”性,改變選項(xiàng)的順序,例如我們使用<<GetValue|Get|SetValue|Set>>,這樣我們就可以優(yōu)先搜索最長(zhǎng)的匹配。我們也可以把四個(gè)選項(xiàng)結(jié)合起來(lái)成兩個(gè)選項(xiàng):<<Get(Value)?|Set(Value)?>>。因?yàn)閱?wèn)號(hào)重復(fù)符是貪婪的,所以SetValue總會(huì)在Set之前被匹配。

      一個(gè)更好的方案是使用單詞邊界:<<b(Get|GetValue|Set|SetValue)b>>或<<b(Get(Value)?|Set(Value)?b>>。更進(jìn)一步,既然所有的選擇都有相同的結(jié)尾,我們可以把正則表達(dá)式優(yōu)化為<<b(Get|Set)(Value)?b>>。

      11. 組與向后引用

      把正則表達(dá)式的一部分放在圓括號(hào)內(nèi),你可以將它們形成組。然后你可以對(duì)整個(gè)組使用一些正則操作,例如重復(fù)操作符。

      要注意的是,只有圓括號(hào)“()”才能用于形成組?!癧]”用于定義字符集。“{}”用于定義重復(fù)操作。

      當(dāng)用“()”定義了一個(gè)正則表達(dá)式組后,正則引擎則會(huì)把被匹配的組按照順序編號(hào),存入緩存。當(dāng)對(duì)被匹配的組進(jìn)行向后引用的時(shí)候,可以用“數(shù)字”的方式進(jìn)行引用。<<1>>引用第一個(gè)匹配的后向引用組,<<2>>引用第二個(gè)組,以此類推,<<n>>引用第n個(gè)組。而<<