新聞中心
我一直對(duì)正則表達(dá)式很感興趣,在網(wǎng)上查找過(guò)不少資料,看過(guò)不少的教程。覺得只有用“深入淺出”才能準(zhǔn)確的表達(dá)正則表達(dá)式,所以也就不能免俗了,我們來(lái)看看吧。

專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)余杭免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1.什么是VB.NET正則表達(dá)式
基本說(shuō)來(lái),正則表達(dá)式是一種用來(lái)描述一定數(shù)量文本的模式。Regex代表RegularExpress。本文將用 < > 來(lái)表示一段具體的正則表達(dá)式。一段文本就是最基本的模式,簡(jiǎn)單的匹配相同的文本。
2.不同的VB.NET正則表達(dá)式引擎
正則表達(dá)式引擎是一種可以處理正則表達(dá)式的軟件。通常,引擎是更大的應(yīng)用程序的一部分。在軟件世界,不同的正則表達(dá)式并不互相兼容。本教程會(huì)集中討論P(yáng)erl5類型的引擎,因?yàn)檫@種引擎是應(yīng)用最廣泛的引擎。同時(shí)我們也會(huì)提到一些和其他引擎的區(qū)別。許多近代的引擎都很類似,但不完全一樣。例如.NET正則庫(kù),JDK正則包。
3.文字符號(hào)
最基本的正則表達(dá)式由單個(gè)文字符號(hào)組成。如 < > ,它將匹配字符串中***次出現(xiàn)的字符“a”。如對(duì)字符串“Jackisaboy”。“J”后的“a”將被匹配。而第二個(gè)“a”將不會(huì)被匹配。正則表達(dá)式也可以匹配第二個(gè)“a”,這必須是你告訴正則表達(dá)式引擎從***次匹配的地方開始搜索。在文本編輯器中,你可以使用“查找下一個(gè)”。在編程語(yǔ)言中,會(huì)有一個(gè)函數(shù)可以使你從前一次匹配的位置開始繼續(xù)向后搜索。類似的, < > 會(huì)匹配“Aboutcatsanddogs”中的“cat”。這等于是告訴VB.NET正則表達(dá)式引擎,找到一個(gè) < > ,緊跟一個(gè) < > ,再跟一個(gè) < > 。要注意,正則表達(dá)式引擎缺省是大小寫敏感的。除非你告訴引擎忽略大小寫,否則 < > 不會(huì)匹配“Cat”。
特殊字符對(duì)于文字字符,有11個(gè)字符被保留作特殊用途。他們是:[]\^$. |?*+()這些特殊字符也被稱作元字符。如果你想在正則表達(dá)式中將這些字符用作文本字符,你需要用反斜杠“\”對(duì)其進(jìn)行換碼(escape)。例如你想匹配“1+1=2”,正確的表達(dá)式為 < <1\+1=2> >
需要注意的是, < <1+1=2> > 也是有效的正則表達(dá)式。但它不會(huì)匹配“1+1=2”,而會(huì)匹配“123+111=234”中的“111=2”。因?yàn)椤?”在這里表示特殊含義(重復(fù)1次到多次)。在編程語(yǔ)言中,要注意,一些特殊的字符會(huì)先被編譯器處理,然后再傳遞給正則引擎。因此正則表達(dá)式 < <1\+2=2> > 在C++中要寫成“1\\+1=2”。為了匹配“C:\temp”,你要用正則表達(dá)式 < > 。而在C++中,正則表達(dá)式則變成了“C:\\\\temp”。
不可顯示字符可以使用特殊字符序列來(lái)代表某些不可顯示字符: < <\t> > 代表Tab(0x09) < <\r> > 代表回車符(0x0D) < <\n> > 代表?yè)Q行符(0x0A)要注意的是Windows中文本文件使用“\r\n”來(lái)結(jié)束一行而Unix使用“\n”。
4.VB.NET正則表達(dá)式引擎的內(nèi)部工作機(jī)制
知道正則表達(dá)式引擎是如何工作的有助于你很快理解為何某個(gè)正則表達(dá)式不像你期望的那樣工作。有兩種類型的引擎:文本導(dǎo)向(text-directed)的引擎和正則導(dǎo)向(regex-directed)的引擎。JeffreyFriedl把他們稱作DFA和NFA引擎。本文談到的是正則導(dǎo)向的引擎。這是因?yàn)橐恍┓浅S杏玫奶匦?,如“惰性”量詞(lazyquantifiers)和反向引用(backreferences),只能在正則導(dǎo)向的引擎中實(shí)現(xiàn)。所以毫不意外這種引擎是目前***的引擎。你可以輕易分辨出所使用的引擎是文本導(dǎo)向還是正則導(dǎo)向。如果反向引用或“惰性”量詞被實(shí)現(xiàn),則可以肯定你使用的引擎是正則導(dǎo)向的。你可以作如下測(cè)試:將正則表達(dá)式 < > 應(yīng)用到字符串“regexnot”。如果匹配的結(jié)果是regex,則引擎是正則導(dǎo)向的。如果結(jié)果是regexnot,則是文本導(dǎo)向的。因?yàn)檎齽t導(dǎo)向的引擎是“猴急”的,它會(huì)很急切的進(jìn)行表功,報(bào)告它找到的***個(gè)匹配。
正則導(dǎo)向的引擎總是返回最左邊的匹配這是需要你理解的很重要的一點(diǎn):即使以后有可能發(fā)現(xiàn)一個(gè)“更好”的匹配,正則導(dǎo)向的引擎也總是返回最左邊的匹配。當(dāng)把 < > 應(yīng)用到“Hecapturedacatfishforhiscat”,引擎先比較 < > 和“H”,結(jié)果失敗了。于是引擎再比較 < > 和“e”,也失敗了。直到第四個(gè)字符, < > 匹配了“c”。 < > 匹配了第五個(gè)字符。到第六個(gè)字符 < > 沒能匹配“p”,也失敗了。引擎再繼續(xù)從第五個(gè)字符重新檢查匹配性。直到第十五個(gè)字符開始, < > 匹配上了“catfish”中的“cat”,正則表達(dá)式引擎急切的返回***個(gè)匹配的結(jié)果,而不會(huì)再繼續(xù)查找是否有其他更好的匹配。
5.字符集
字符集是由一對(duì)方括號(hào)“[]”括起來(lái)的字符集合。使用字符集,你可以告訴正則表達(dá)式引擎僅僅匹配多個(gè)字符中的一個(gè)。如果你想匹配一個(gè)“a”或一個(gè)“e”,使用 < <[ae]> > 。你可以使用 < > 匹配gray或grey。這在你不確定你要搜索的字符是采用美國(guó)英語(yǔ)還是英國(guó)英語(yǔ)時(shí)特別有用。相反, < > 將不會(huì)匹配graay或graey。字符集中的字符順序并沒有什么關(guān)系,結(jié)果都是相同的。你可以使用連字符“-”定義一個(gè)字符范圍作為字符集。 < <[0-9]> > 匹配0到9之間的單個(gè)數(shù)字。你可以使用不止一個(gè)范圍。 < <[0-9a-fA-F]> > 匹配單個(gè)的十六進(jìn)制數(shù)字,并且大小寫不敏感。你也可以結(jié)合范圍定義與單個(gè)字符定義。 < <[0-9a-fxA-FX]> > 匹配一個(gè)十六進(jìn)制數(shù)字或字母X。再次強(qiáng)調(diào)一下,字符和范圍定義的先后順序?qū)Y(jié)果沒有影響。
字符集的一些應(yīng)用查找一個(gè)可能有拼寫錯(cuò)誤的單詞,比如 < > 或 < > 。查找程序語(yǔ)言的標(biāo)識(shí)符, < > 。(*表示重復(fù)0或多次)查找C風(fēng)格的十六進(jìn)制數(shù) < <0[xX][A-Fa-f0-9]+> > 。(+表示重復(fù)一次或多次)
取反字符集在左方括號(hào)“[”后面緊跟一個(gè)尖括號(hào)“^”,將會(huì)對(duì)字符集取反。結(jié)果是字符集將匹配任何不在方括號(hào)中的字符。不像“.”,取反字符集是可以匹配回車換行符的。需要記住的很重要的一點(diǎn)是,取反字符集必須要匹配一個(gè)字符。 < > 并不意味著:匹配一個(gè)q,后面沒有u跟著。它意味著:匹配一個(gè)q,后面跟著一個(gè)不是u的字符。所以它不會(huì)匹配“Iraq”中的q,而會(huì)匹配“Iraqisacountry”中的q和一個(gè)空格符。事實(shí)上,空格符是匹配中的一部分,因?yàn)樗且粋€(gè)“不是u的字符”。如果你只想匹配一個(gè)q,條件是q后面有一個(gè)不是u的字符,我們可以用后面將講到的向前查看來(lái)解決。
字符集中的元字符需要注意的是,在字符集中只有4個(gè)字符具有特殊含義。它們是:“]\^-”?!癩”代表字符集定義的結(jié)束;“\”代表轉(zhuǎn)義;“^”代表取反;“-”代表范圍定義。其他常見的元字符在字符集定義內(nèi)部都是正常字符,不需要轉(zhuǎn)義。例如,要搜索星號(hào)*或加號(hào)+,你可以用 < <[+*]> > 。當(dāng)然,如果你對(duì)那些通常的元字符進(jìn)行轉(zhuǎn)義,你的正則表達(dá)式一樣會(huì)工作得很好,但是這會(huì)降低可讀性。在字符集定義中為了將反斜杠“\”作為一個(gè)文字字符而非特殊含義的字符,你需要用另一個(gè)反斜杠對(duì)它進(jìn)行轉(zhuǎn)義。 < <[\\x]> > 將會(huì)匹配一個(gè)反斜杠和一個(gè)X?!癩^-”都可以用反斜杠進(jìn)行轉(zhuǎn)義,或者將他們放在一個(gè)不可能使用到他們特殊含義的位置。我們推薦后者,因?yàn)檫@樣可以增加可讀性。比如對(duì)于字符“^”,將它放在除了左括號(hào)“[”后面的位置,使用的都是文字字符含義而非取反含義。如 < <[x^]> > 會(huì)匹配一個(gè)x或^。 < <[]x]> > 會(huì)匹配一個(gè)“]”或“x”。 < <[-x]> > 或 < <[x-]> > 都會(huì)匹配一個(gè)“-”或“x”。
字符集的簡(jiǎn)寫因?yàn)橐恍┳址浅3S?,所以有一些?jiǎn)寫方式。 < <\d> > 代表 < <[0-9]> > ; < <\w> > 代表單詞字符。這個(gè)是隨正則表達(dá)式實(shí)現(xiàn)的不同而有些差異。絕大多數(shù)的正則表達(dá)式實(shí)現(xiàn)的單詞字符集都包含了 < > 。 < <\s> > 代表“白字符”。這個(gè)也是和不同的實(shí)現(xiàn)有關(guān)的。在絕大多數(shù)的實(shí)現(xiàn)中,都包含了空格符和Tab符,以及回車換行符 < <\r\n> > 。字符集的縮寫形式可以用在方括號(hào)之內(nèi)或之外。 < <\s\d> > 匹配一個(gè)白字符后面緊跟一個(gè)數(shù)字。 < <[\s\d]> > 匹配單個(gè)白字符或數(shù)字。 < <[\da-fA-F]> > 將匹配一個(gè)十六進(jìn)制數(shù)字。取反字符集的簡(jiǎn)寫 < <[\S]> > = < <[^\s]> > < <[\W]> > = < <[^\w]> > < <[\D]> > = < <[^\d]> >
字符集的重復(fù)如果你用“?*+”操作符來(lái)重復(fù)一個(gè)字符集,你將會(huì)重復(fù)整個(gè)字符集。而不僅是它匹配的那個(gè)字符。正則表達(dá)式 < <[0-9]+> > 會(huì)匹配837以及222。如果你僅僅想重復(fù)被匹配的那個(gè)字符,可以用向后引用達(dá)到目的。我們以后將講到向后引用。
【編輯推薦】
- 剖析VB.NET平臺(tái)調(diào)用是如何執(zhí)行操作
- 分享個(gè)人總結(jié)VB.NET多線程
- 詳細(xì)說(shuō)明VB.NET變量中四點(diǎn)
- 三類十二種VB.NET數(shù)據(jù)類型全面介紹
- VB.NET初步知識(shí),初學(xué)者必看
標(biāo)題名稱:詳談關(guān)于VB.NET正則表達(dá)式引擎工作機(jī)制
當(dāng)前地址:http://fisionsoft.com.cn/article/djchhce.html


咨詢
建站咨詢
