您好,登錄后才能下訂單哦!
至此,已經(jīng)談?wù)摿吮玖x字符和字符集。錨不同于這兩種。錨不匹配任何字符,他們匹配一個(gè)在字符串前,后或者中間的位置。他們可以用來(lái)定位正則表達(dá)式匹配一個(gè)位置。脫字符號(hào)^匹配字符串首字符前面的位置。使用^a匹配abc,可以匹配a,但是^b不能匹配,因?yàn)閎不是首字符,不能被^匹配。同樣的$匹配字符串的最后一個(gè)位置,c$可以匹配abc中的c,但是a$不能匹配。
使用^ 和 $如果一個(gè)字符串包含多行,例如first line\nsecond line (\n是換號(hào)符),很多時(shí)候我們希望處理行而不是整個(gè)字符串。因此本教程里所有的正則表達(dá)式都有一個(gè)選項(xiàng)來(lái)擴(kuò)展錨的語(yǔ)義。^可以匹配字符串的開(kāi)始位置,也可以匹配每一行換行符的后面位置(\n和s之間),同樣的$匹配每一行末尾的位置(最后一個(gè)e的后面),也可以匹配每一行換行符的前面(e和\n之間)。
文本編輯器EditPad Pro或者 GNU Emacs, 或者正則表達(dá)式工具 PowerGREP,脫字符^和美元符號(hào)總是匹配每一行的開(kāi)始和結(jié)尾位置。這是由于這些工具設(shè)計(jì)就是用來(lái)處理整個(gè)文件的為而不是字符串。
在本教程中討論的程序語(yǔ)言中,除了Ruby,你必須顯示的激活擴(kuò)展的功能,通常叫做多行模式。在Perl中,你需要在正則表達(dá)式后面加一個(gè)m,例如:m/^regex$/m。在.NET里,錨匹配每一行的開(kāi)頭和結(jié)尾時(shí),得使用Regex.Match("string", "regex", RegexOptions.Multiline)。
零寬匹配我們都知道了,錨匹配一個(gè)位置,而不是匹配一個(gè)字符,這幾意味著當(dāng)一個(gè)正則表達(dá)式僅包含一個(gè)或者多個(gè)錨的時(shí)候,可以匹配0長(zhǎng)度的字符串,這有時(shí)非常有用,有時(shí)非常討厭。 用^\d*$來(lái)測(cè)試用戶(hù)是否輸入了有效的數(shù)字,這會(huì)導(dǎo)致空字符串也是有效數(shù)字。有時(shí)候僅僅匹配位置也是很有用的,在email中,經(jīng)常用>符號(hào)和空格來(lái)表示每一行引用的消息。在VB.NET中,我們可以用 Dim Quoted as String = Regex.Replace(Original, "^", "> ", RegexOptions.Multiline)很方便的處理。我們可以使用多行模式,那樣的話(huà)^匹配了引用消息的開(kāi)始位置。這個(gè)正則表達(dá)式會(huì)刪除匹配項(xiàng),并且插入字符串"> "到起始位置,由于匹配項(xiàng)不包含任何字符,所以沒(méi)有任何東西被刪除。但是匹配項(xiàng)包含一個(gè)起始位置,替換的字符串正好可以插入在這里就如我們希望的那樣。
正則表達(dá)式內(nèi)部讓我們看一下,多行模式下試圖匹配^4$到749\n486\n4(\n是換號(hào)符)的時(shí)候發(fā)生了什么,正則表達(dá)式從第一個(gè)字符7開(kāi)始。第一個(gè)正則表達(dá)式的匹配符是^。由于這個(gè)符號(hào)是零寬字符,引擎不會(huì)去匹配字符,但是會(huì)去匹配目前達(dá)到的字符前面的位置。^正好匹配了7前面的位置。引擎然后前進(jìn)到下一個(gè)符號(hào)4。由于先前的符號(hào)是零寬的,正則表達(dá)式引擎不會(huì)前進(jìn)到字符串中的下一個(gè)位子,仍然在7上,4是一個(gè)本義字符,不匹配7.沒(méi)有其他的組合能匹配這個(gè)這種表達(dá)式,所以引擎重新從4之前的位置開(kāi)始匹配。這個(gè)位置前面是個(gè)字符,并且這個(gè)字符也不是換行符。引擎繼續(xù)繼續(xù)前進(jìn)到9,再次失敗。下一步在\n,還是失敗。再次在\n的前面的位置,是一個(gè)9,這個(gè)字符也不是換行符。
接下來(lái),引擎達(dá)到字符串中的第二個(gè)4。^匹配了4前面的位置,因?yàn)樗懊媸莻€(gè)換行符。接下來(lái)引擎前進(jìn)到下個(gè)符號(hào),4,但不繼續(xù)字符串中的位置,4匹配了4,引擎同時(shí)前進(jìn)正則表達(dá)式符號(hào)和字符?,F(xiàn)在引擎企圖在8前面這個(gè)位置匹配$,這個(gè)$不能得到匹配,因?yàn)檫@個(gè)位置后面有字符,并且這個(gè)字符還不是一個(gè)換行符
繼續(xù),引擎必須試著再次匹配第一個(gè)符號(hào)。預(yù)先的,成功匹配第二個(gè)4,所以引擎繼續(xù)匹配下一個(gè)字符8,^不能匹配。接下來(lái)的6和換行符也同樣失敗。
最后,引擎試著匹配第一個(gè)符號(hào)在第三個(gè)4上。成功。接下來(lái),引擎成功匹配用4匹配4.當(dāng)然正在表達(dá)式符號(hào)前進(jìn)到$了,擯棄當(dāng)前字符也被前進(jìn)到字符串的最后一個(gè)位置了,字符串后面的空白處。沒(méi)有任何符號(hào)需要字符去匹配,但是我們?cè)囍ヅ湟粋€(gè)$符號(hào),這個(gè)強(qiáng)大的美元是個(gè)怪獸。他不介意這個(gè)“字符”是字符串后面的空白。事實(shí)上,這個(gè)美元符號(hào)檢查當(dāng)前字符,它必須是個(gè)換行符或者字符串后面的空白,$匹配當(dāng)前字符前面的位置。所以美元符號(hào)匹配成功,就是最后一個(gè)4.
程序員注意了正則表達(dá)式諸如$,可以匹配字符串后面的位置,如果你查詢(xún)引擎詢(xún)問(wèn)字符的位置,它會(huì)告訴你字符串的長(zhǎng)度(如果字符串索引是基于0的話(huà)),或者length+1(如果字符串索引是基于1的話(huà),這取決于 你的編程語(yǔ)言),如果你詢(xún)問(wèn)因?yàn)槠ヅ涞拈L(zhǎng)度。會(huì)得到0.
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。