正則表達(dá)式的選擇符探討
正則表達(dá)式的選擇符的操作使得我們?cè)谑褂谜齽t表達(dá)式是更加得心應(yīng)手,那么具體的實(shí)現(xiàn)有什么呢?還有就是正則表達(dá)式選擇符的使用原理是什么呢?讓我們來(lái)看看具體的內(nèi)容。
正則表達(dá)式中“|”表示選擇。你可以用選擇符匹配多個(gè)可能的正則表達(dá)式中的一個(gè)。
如果你想搜索文字“cat”或“dog”,你可以用<<cat|dog>>。如果你想有更多的選擇,你只要擴(kuò)展列表<<cat|dog|mouse|fish>>。
選擇符在正則表達(dá)式中具有***的優(yōu)先級(jí),也就是說,它告訴引擎要么匹配選擇符左邊的所有表達(dá)式,要么匹配右邊的所有表達(dá)式。你也可以用圓括號(hào)來(lái)限制選擇符的作用范圍。如<<\b(cat|dog)\b>>,這樣告訴正則引擎把(cat|dog)當(dāng)成一個(gè)正則表達(dá)式單位來(lái)處理。
正則表達(dá)式的選擇符的原理分析:
注意正則引擎的“急于表功”性
正則引擎是急切的,當(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á)式并沒有匹配整個(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)閱柼?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>>。
正則表達(dá)式的選擇符相關(guān)的內(nèi)容就向你介紹到這里,希望對(duì)你了解和掌握正則表達(dá)式的選擇符方面的操作有所幫助。
【編輯推薦】
























