正則表達(dá)式的選擇符探討
正則表達(dá)式的選擇符的操作使得我們在使用正則表達(dá)式是更加得心應(yīng)手,那么具體的實(shí)現(xiàn)有什么呢?還有就是正則表達(dá)式選擇符的使用原理是什么呢?讓我們來看看具體的內(nèi)容。
正則表達(dá)式中“|”表示選擇。你可以用選擇符匹配多個可能的正則表達(dá)式中的一個。
如果你想搜索文字“cat”或“dog”,你可以用<<cat|dog>>。如果你想有更多的選擇,你只要擴(kuò)展列表<<cat|dog|mouse|fish>>。
選擇符在正則表達(dá)式中具有***的優(yōu)先級,也就是說,它告訴引擎要么匹配選擇符左邊的所有表達(dá)式,要么匹配右邊的所有表達(dá)式。你也可以用圓括號來限制選擇符的作用范圍。如<<\b(cat|dog)\b>>,這樣告訴正則引擎把(cat|dog)當(dāng)成一個正則表達(dá)式單位來處理。
正則表達(dá)式的選擇符的原理分析:
注意正則引擎的“急于表功”性
正則引擎是急切的,當(dāng)它找到一個有效的匹配時,它會停止搜索。因此在一定條件下,選擇符兩邊的表達(dá)式的順序?qū)Y(jié)果會有影響。假設(shè)你想用正則表達(dá)式搜索一個編程語言的函數(shù)列表:Get,GetValue,Set或SetValue。一個明顯的解決方案是<<Get|GetValue|Set|SetValue>>。讓我們看看當(dāng)搜索SetValue時的結(jié)果。
因?yàn)?lt;<Get>>和<<GetValue>>都失敗了,而<<Set>>匹配成功。因?yàn)檎齽t導(dǎo)向的引擎都是“急切”的,所以它會返回***個成功的匹配,就是“Set”,而不去繼續(xù)搜索是否有其他更好的匹配。
和我們期望的相反,正則表達(dá)式并沒有匹配整個字符串。有幾種可能的解決辦法。一是考慮到正則引擎的“急切”性,改變選項(xiàng)的順序,例如我們使用<<GetValue|Get|SetValue|Set>>,這樣我們就可以優(yōu)先搜索最長的匹配。我們也可以把四個選項(xiàng)結(jié)合起來成兩個選項(xiàng):<<Get(Value)?|Set(Value)?>>。因?yàn)閱柼栔貜?fù)符是貪婪的,所以SetValue總會在Set之前被匹配。
一個更好的方案是使用單詞邊界:<<\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)容就向你介紹到這里,希望對你了解和掌握正則表達(dá)式的選擇符方面的操作有所幫助。
【編輯推薦】