您好,登錄后才能下訂單哦!
小編給大家分享一下VB.NET正則表達式的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1.選擇符
VB.NET正則表達式中“ ¦”表示選擇。你可以用選擇符匹配多個可能的正則表達式中的一個。如果你想搜索文字“cat”或“dog”,你可以用﹤﹤cat ¦dog> > 。如果你想有更多的選擇,你只要擴展列表﹤﹤cat ¦dog ¦mouse ¦fish> > 。選擇符在正則表達式中具有***的優先級,也就是說,它告訴引擎要么匹配選擇符左邊的所有表達式,要么匹配右邊的所有表達式。你也可以用圓括號來限制選擇符的作用范圍。如﹤﹤\b(cat ¦dog)\b> > ,這樣告訴正則引擎把(cat ¦dog)當成一個正則表達式單位來處理。
注意正則引擎的“急于表功”性正則引擎是急切的,當它找到一個有效的匹配時,它會停止搜索。因此在一定條件下,選擇符兩邊的表達式的順序對結果會有影響。假設你想用正則表達式搜索一個編程語言的函數列表:Get,GetValue,Set或SetValue。一個明顯的解決方案是﹤﹤Get ¦GetValue ¦Set ¦SetValue> > 。讓我們看看當搜索SetValue時的結果。因為﹤﹤Get> > 和﹤﹤GetValue> > 都失敗了,而﹤﹤Set> > 匹配成功。因為正則導向的引擎都是“急切”的,所以它會返回***個成功的匹配,就是“Set”,而不去繼續搜索是否有其他更好的匹配。和我們期望的相反,正則表達式并沒有匹配整個字符串。有幾種可能的解決辦法。
一是考慮到正則引擎的“急切”性,改變選項的順序,例如我們使用﹤﹤GetValue ¦Get ¦SetValue ¦Set> > ,這樣我們就可以優先搜索最長的匹配。我們也可以把四個選項結合起來成兩個選項:﹤﹤Get(Value)? ¦Set(Value)?> > 。因為問號重復符是貪婪的,所以SetValue總會在Set之前被匹配。一個更好的方案是使用單詞邊界:﹤﹤\b(Get ¦GetValue ¦Set ¦SetValue)\b> > 或﹤﹤\b(Get(Value)? ¦Set(Value)?\b> > 。更進一步,既然所有的選擇都有相同的結尾,我們可以把正則表達式優化為﹤﹤\b(Get ¦Set)(Value)?\b> > 。
2.組與向后引用
把正則表達式的一部分放在圓括號內,你可以將它們形成組。然后你可以對整個組使用一些正則操作,例如重復操作符。要注意的是,只有圓括號“()”才能用于形成組。“[]”用于定義字符集。“{}”用于定義重復操作。當用“()”定義了一個正則表達式組后,正則引擎則會把被匹配的組按照順序編號,存入緩存。當對被匹配的組進行向后引用的時候,可以用“\數字”的方式進行引用。﹤﹤\1> > 引用***個匹配的后向引用組,﹤﹤\2> > 引用第二個組,以此類推,﹤﹤\n> > 引用第n個組。而﹤﹤\0> > 則引用整個被匹配的正則表達式本身。我們看一個例子。假設你想匹配一個HTML標簽的開始標簽和結束標簽,以及標簽中間的文本。比如 Thisisatest ,我們要匹配 和 以及中間的文字。我們可以用如下正則表達式:“ <([A-Z][A-Z0-9]*)[^> ]*> .*? ”首先,“ <”將會匹配“ ”的***個字符“ <”。然后[A-Z]匹配B,[A-Z0-9]*將會匹配0到多次字母數字,后面緊接著0到多個非“> ”的字符。***正則表達式的“> ”將會匹配“ ”的“> ”。
接下來正則引擎將對結束標簽之前的字符進行惰性匹配,直到遇到一個“ ”你可以對相同的后向引用組進行多次引用,﹤﹤([a-c])x\1x\1> > 將匹配“axaxa”、“bxbxb”以及“cxcxc”。如果用數字形式引用的組沒有有效的匹配,則引用到的內容簡單的為空。一個后向引用不能用于它自身。﹤﹤([abc]\1)> > 是錯誤的。因此你不能將﹤﹤\0> > 用于一個正則表達式匹配本身,它只能用于替換操作中。后向引用不能用于字符集內部。﹤﹤(a)[\1b]> > 中的﹤﹤\1> > 并不表示后向引用。在字符集內部,﹤﹤\1> > 可以被解釋為八進制形式的轉碼。向后引用會降低引擎的速度,因為它需要存儲匹配的組。如果你不需要向后引用,你可以告訴引擎對某個組不存儲。例如:﹤﹤Get(?:Value)> > 。其中“(”后面緊跟的“?:”會告訴引擎對于組(Value),不存儲匹配的值以供后向引用。
重復操作與后向引用當對組使用重復操作符時,緩存里后向引用內容會被不斷刷新,只保留***匹配的內容。例如:﹤﹤([abc]+)=\1> > 將匹配“cab=cab”,但是﹤﹤([abc])+=\1> > 卻不會。因為([abc])***次匹配“c”時,“\1”代表“c”;然后([abc])會繼續匹配“a”和“b”。***“\1”代表“b”,所以它會匹配“cab=b”。應用:檢查重復單詞--當編輯文字時,很容易就會輸入重復單詞,例如“thethe”。使用﹤﹤\b(\w+)\s+\1\b> > 可以檢測到這些重復單詞。要刪除第二個單詞,只要簡單的利用替換功能替換掉“\1”就可以了。
組的命名和引用在PHP,Python中,可以用﹤﹤(?P
下面是.NET中的例子:(?
3.VB.NET正則表達式的匹配模式
本教程所討論的正則表達式引擎都支持三種匹配模式:﹤﹤/i> > 使正則表達式對大小寫不敏感,﹤﹤/s> > 開啟“單行模式”,即點號“.”匹配新行符﹤﹤/m> > 開啟“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。
在正則表達式內部打開或關閉模式如果你在正則表達式內部插入修飾符(?ism),則該修飾符只對其右邊的正則表達式起作用。(?-i)是關閉大小寫不敏感。你可以很快的進行測試。﹤﹤(?i)te(?-i)st> > 應該匹配TEst,但是不能匹配teST或TEST.
4.原子組與防止回溯
在一些特殊情況下,因為回溯會使得引擎的效率極其低下。
讓我們看一個例子:要匹配這樣的字串,字串中的每個字段間用逗號做分隔符,第12個字段由P開頭。我們容易想到這樣的正則表達式﹤﹤^(.*?,){11}P> > 。這個正則表達式在正常情況下工作的很好。但是在極端情況下,如果第12個字段不是由P開頭,則會發生災難性的回溯。如要搜索的字串為“1,2,3,4,5,6,7,8,9,10,11,12,13”。首先,正則表達式一直成功匹配直到第12個字符。這時,前面的正則表達式消耗的字串為“1,2,3,4,5,6,7,8,9,10,11,”,到了下一個字符,﹤﹤P> > 并不匹配“12”。所以引擎進行回溯,這時正則表達式消耗的字串為“1,2,3,4,5,6,7,8,9,10,11”。繼續下一次匹配過程,下一個正則符號為點號﹤﹤.> > ,可以匹配下一個逗號“,”。然而﹤﹤,> > 并不匹配字符“12”中的“1”。匹配失敗,繼續回溯。大家可以想象,這樣的回溯組合是個非常大的數量。因此可能會造成引擎崩潰。
用于阻止這樣巨大的回溯有幾種方案:一種簡單的方案是盡可能的使匹配精確。用取反字符集代替點號。例如我們用如下正則表達式﹤﹤^([^,\r\n]*,){11}P> > ,這樣可以使失敗回溯的次數下降到11次。另一種方案是使用原子組。原子組的目的是使正則引擎失敗的更快一點。因此可以有效的阻止海量回溯。原子組的語法是﹤﹤(?> 正則表達式)> > 。位于(?> )之間的所有正則表達式都會被認為是一個單一的正則符號。一旦匹配失敗,引擎將會回溯到原子組前面的正則表達式部分。前面的例子用原子組可以表達成﹤﹤^(?> (.*?,){11})P> > 。一旦第十二個字段匹配失敗,引擎回溯到原子組前面的﹤﹤^> > 。
以上是“VB.NET正則表達式的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。