新聞中心
本人很喜歡VB.NET正則表達(dá)式引擎,在工作中也很喜歡總結(jié)關(guān)于VB.NET正則表達(dá)式的經(jīng)驗(yàn)教訓(xùn),下面就這個(gè)問(wèn)題來(lái)詳細(xì)說(shuō)說(shuō)吧。

湯旺網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
什么是正則表達(dá)式
基本說(shuō)來(lái),正則表達(dá)式是一種用來(lái)描述一定數(shù)量文本的模式。Regex代表RegularExpress。本文將用 < > 來(lái)表示一段具體的正則表達(dá)式。一段文本就是最基本的模式,簡(jiǎn)單的匹配相同的文本。
向前查看與向后查看
Perl5引入了兩個(gè)強(qiáng)大的正則語(yǔ)法:“向前查看”和“向后查看”。他們也被稱(chēng)作“零長(zhǎng)度斷言”。他們和錨定一樣都是零長(zhǎng)度的(所謂零長(zhǎng)度即指該正則表達(dá)式不消耗被匹配的字符串)。不同之處在于“前后查看”會(huì)實(shí)際匹配字符,只是他們會(huì)拋棄匹配只返回匹配結(jié)果:匹配或不匹配。這就是為什么他們被稱(chēng)作“斷言”。他們并不實(shí)際消耗字符串中的字符,而只是斷言一個(gè)匹配是否可能。幾乎本文討論的所有正則表達(dá)式的實(shí)現(xiàn)都支持“向前向后查看”。唯一的一個(gè)例外是Javascript只支持向前查看。
肯定和否定式的向前查看如我們前面提過(guò)的一個(gè)例子:要查找一個(gè)q,后面沒(méi)有緊跟一個(gè)u。也就是說(shuō),要么q后面沒(méi)有字符,要么后面的字符不是u。采用否定式向前查看后的一個(gè)解決方案為 < > 。否定式向前查看的語(yǔ)法是 < <(?!查看的內(nèi)容)> > ??隙ㄊ较蚯安榭春头穸ㄊ较蚯安榭春茴?lèi)似: < <(?=查看的內(nèi)容)> > 。如果在“查看的內(nèi)容”部分有組,也會(huì)產(chǎn)生一個(gè)向后引用。但是向前查看本身并不會(huì)產(chǎn)生向后引用,也不會(huì)被計(jì)入向后引用的編號(hào)中。這是因?yàn)橄蚯安榭幢旧硎菚?huì)被拋棄掉的,只保留匹配與否的判斷結(jié)果。如果你想保留匹配的結(jié)果作為向后引用,你可以用 < <(?=(regex))> > 來(lái)產(chǎn)生一個(gè)向后引用。
肯定和否定式的先后查看向后查看和向前查看有相同的效果,只是方向相反否定式向后查看的語(yǔ)法是: < <(? > 肯定式向后查看的語(yǔ)法是: < <(? <=查看內(nèi)容)> > 我們可以看到,和向前查看相比,多了一個(gè)表示方向的左尖括號(hào)。例: < <(? > 將會(huì)匹配一個(gè)沒(méi)有“a”作前導(dǎo)字符的“b”。值得注意的是:向前查看從當(dāng)前字符串位置開(kāi)始對(duì)“查看”正則表達(dá)式進(jìn)行匹配;向后查看則從當(dāng)前字符串位置開(kāi)始先后回溯一個(gè)字符,然后再開(kāi)始對(duì)“查看”正則表達(dá)式進(jìn)行匹配。
深入VB.NET正則表達(dá)式引擎內(nèi)部讓我們看一個(gè)簡(jiǎn)單例子。把正則表達(dá)式 < > 應(yīng)用到字符串“Iraq”。正則表達(dá)式的第一個(gè)符號(hào)是 < > 。正如我們知道的,引擎在匹配 <
> 以前會(huì)掃過(guò)整個(gè)字符串。當(dāng)?shù)谒膫€(gè)字符“q”被匹配后,“q”后面是空字符(void)。而下一個(gè)正則符號(hào)是向前查看。引擎注意到已經(jīng)進(jìn)入了一個(gè)向前查看正則表達(dá)式部分。下一個(gè)正則符號(hào)是 < > ,和空字符不匹配,從而導(dǎo)致向前查看里的正則表達(dá)式匹配失敗。因?yàn)槭且粋€(gè)否定式的向前查看,意味著整個(gè)向前查看結(jié)果是成功的。于是匹配結(jié)果“q”被返回了。我們?cè)诎严嗤恼齽t表達(dá)式應(yīng)用到“quit”。 <
> 匹配了“q”。下一個(gè)正則符號(hào)是向前查看部分的 < > ,它匹配了字符串中的第二個(gè)字符“i”。引擎繼續(xù)走到下個(gè)字符“i”。然而引擎這時(shí)注意到向前查看部分已經(jīng)處理完了,并且向前查看已經(jīng)成功。于是引擎拋棄被匹配的字符串部分,這將導(dǎo)致引擎回退到字符“u”。因?yàn)橄蚯安榭词欠穸ㄊ降?,意味著查看部分的成功匹配?dǎo)致了整個(gè)向前查看的失敗,因此引擎不得不進(jìn)行回溯。最后因?yàn)樵贈(zèng)]有其他的“q”和 <
> 匹配,所以整個(gè)匹配失敗了。為了確保你能清楚地理解向前查看的實(shí)現(xiàn),讓我們把 < > 應(yīng)用到“quit”。 <
> 首先匹配“q”。然后向前查看成功匹配“u”,匹配的部分被拋棄,只返回可以匹配的判斷結(jié)果。引擎從字符“i”回退到“u”。由于向前查看成功了,引擎繼續(xù)處理下一個(gè)正則符號(hào) < > 。結(jié)果發(fā)現(xiàn) < > 和“u”不匹配。因此匹配失敗了。由于后面沒(méi)有其他的“q”,整個(gè)正則表達(dá)式的匹配失敗了。
更進(jìn)一步理解VB.NET正則表達(dá)式引擎內(nèi)部機(jī)制讓我們把 < <(? <=a)b> > 應(yīng)用到“thingamabob”。引擎開(kāi)始處理向后查看部分的正則符號(hào)和字符串中的第一個(gè)字符。在這個(gè)例子中,向后查看告訴VB.NET正則表達(dá)式引擎回退一個(gè)字符,然后查看是否有一個(gè)“a”被匹配。因?yàn)樵凇皌”前面沒(méi)有字符,所以引擎不能回退。因此向后查看失敗了。引擎繼續(xù)走到下一個(gè)字符“h”。再一次,引擎暫時(shí)回退一個(gè)字符并檢查是否有個(gè)“a”被匹配。結(jié)果發(fā)現(xiàn)了一個(gè)“t”。向后查看又失敗了。向后查看繼續(xù)失敗,直到正則表達(dá)式到達(dá)了字符串中的“m”,于是肯定式的向后查看被匹配了。因?yàn)樗橇汩L(zhǎng)度的,字符串的當(dāng)前位置仍然是“m”。下一個(gè)正則符號(hào)是 < > ,和“m”匹配失敗。下一個(gè)字符是字符串中的第二個(gè)“a”。引擎向后暫時(shí)回退一個(gè)字符,并且發(fā)現(xiàn) < > 不匹配“m”。在下一個(gè)字符是字符串中的第一個(gè)“b”。引擎暫時(shí)性的向后退一個(gè)字符發(fā)現(xiàn)向后查看被滿(mǎn)足了,同時(shí) < > 匹配了“b”。因此整個(gè)正則表達(dá)式被匹配了。作為結(jié)果,正則表達(dá)式返回字符串中的第一個(gè)“b”。
向前向后查看的應(yīng)用我們來(lái)看這樣一個(gè)例子:查找一個(gè)具有6位字符的,含有“cat”的單詞。首先,我們可以不用向前向后查看來(lái)解決問(wèn)題,例如: < > 足夠簡(jiǎn)單吧!但是當(dāng)需求變成查找一個(gè)具有6-12位字符,含有“cat”,“dog”或“mouse”的單詞時(shí),這種方法就變得有些笨拙了。我們來(lái)看看使用向前查看的方案。在這個(gè)例子中,我們有兩個(gè)基本需求要滿(mǎn)足:一是我們需要一個(gè)6位的字符,二是單詞含有“cat”。滿(mǎn)足第一個(gè)需求的正則表達(dá)式為 < <\b\w{6}\b> > 。滿(mǎn)足第二個(gè)需求的正則表達(dá)式為 < <\b\w*cat\w*\b> > 。把兩者結(jié)合起來(lái),我們可以得到如下的正則表達(dá)式: < <(?=\b\w{6}\b)\b\w*cat\w*\b> > 具體的匹配過(guò)程留給讀者。但是要注意的一點(diǎn)是,向前查看是不消耗字符的,因此當(dāng)判斷單詞滿(mǎn)足具有6個(gè)字符的條件后,引擎會(huì)從開(kāi)始判斷前的位置繼續(xù)對(duì)后面的正則表達(dá)式進(jìn)行匹配。最后作些優(yōu)化,可以得到下面的正則表達(dá)式: < <\b(?=\w{6}\b)\w{0,3}cat\w*> > .正則表達(dá)式中的條件測(cè)試條件測(cè)試的語(yǔ)法為 < <(?ifthen |else)> > ?!癷f”部分可以是向前向后查看表達(dá)式。如果用向前查看,則語(yǔ)法變?yōu)椋?< <(?(?=regex)then |else)> > ,其中else部分是可選的。如果if部分為true,則正則引擎會(huì)試圖匹配then部分,否則引擎會(huì)試圖匹配else部分。需要記住的是,向前先后查看并不實(shí)際消耗任何字符,因此后面的then與else部分的匹配時(shí)從if測(cè)試前的部分開(kāi)始進(jìn)行嘗試。16.為正則表達(dá)式添加注釋在正則表達(dá)式中添加注釋的語(yǔ)法是: < <(?#comment)> > 例:為用于匹配有效日期的正則表達(dá)式添加注釋?zhuān)??#year)(19 |20)\d\d[-/.](?#month)(0[1-9] |1[012])[-/.](?#day)(0[1-9] |[12][0-9] |3[01])
【編輯推薦】
- 剖析VB.NET平臺(tái)調(diào)用是如何執(zhí)行操作
- 分享個(gè)人總結(jié)VB.NET多線(xiàn)程
- 詳細(xì)說(shuō)明VB.NET變量中四點(diǎn)
- 三類(lèi)十二種VB.NET數(shù)據(jù)類(lèi)型全面介紹
- VB.NET初步知識(shí),初學(xué)者必看
文章名稱(chēng):3分鐘讓你知道什么是VB.NET正則表達(dá)式引擎
網(wǎng)頁(yè)網(wǎng)址:http://fisionsoft.com.cn/article/ccsdosg.html


咨詢(xún)
建站咨詢(xún)
