亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

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

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

    元字符<<b>>也是一種對位置進行匹配的“錨”。這種匹配是0長度匹配。

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

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

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

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

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

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

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

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

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

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

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

    然而空格符和<<i>>不匹配。繼續(xù)向后,到了第六個字符“i”,和第五個空格字符之間匹配了<<b>>,然后<<is>>和第六、第七個字符都匹配了。然而第八個字符和第二個“單詞邊界”不匹配,所以匹配又失敗了。到了第13個字符i,因為和前面一個空格符形成“單詞邊界”,同時<<is>>和“is”匹配。引擎接著嘗試匹配第二個<<b>>。因為第15個空格符和“s”形成單詞邊界,所以匹配成功。引擎“急著”返回成功匹配的結(jié)果。

    10. 選擇符

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

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

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

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

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

    因為<<Get>>和<<GetValue>>都失敗了,而<<Set>>匹配成功。因為正則導(dǎo)向的引擎都是“急切”的,所以它會返回第一個成功的匹配,就是“Set”,而不去繼續(xù)搜索是否有其他更好的匹配。

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

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

    11. 組與向后引用

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

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

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