溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么實現(xiàn)Perl正則表達式匹配

發(fā)布時間:2021-12-06 10:09:42 來源:億速云 閱讀:123 作者:小新 欄目:開發(fā)技術

這篇文章主要為大家展示了“怎么實現(xiàn)Perl正則表達式匹配”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么實現(xiàn)Perl正則表達式匹配”這篇文章吧。

Perl正則表達式詳解

Perl正則表達式有三種形式:匹配、替換和轉換。接下來對每一個表達式給出詳盡解釋。

Perl正則表達式匹配:m/<regexp>/這種形式表明在//內(nèi)部的正則表達將用于匹配=~或!~左邊的標量。為了語法上的簡化用/<regexp>/,略去m。

Perl正則表達式替換:s/<regexp>/<substituteText>/這種形式表明Perl正則表達式<regexp>將被文本<substituteText>替換,為了語法的簡化用/<regexp>/<substituteText>略去s。

Perl正則表達式轉換:tr/<charClass>/<substituteClass>/這種形式包含一系列的字符&mdash;/<charClass>&mdash;同時把它們替換為<substituteClass>。

注意轉換<tr>并不真正是一個Perl正則表達式,但是對于用Perl正則表達式難于處理的數(shù)據(jù)常使用它來進行操縱。因此,tr/[0-9]/9876543210.組成1223456789,987654321等字符串。

◆通過使用=~(用英語講:does,與“進行匹配”同)和!~(英語:doesn't,與“不匹配”同)把這些表達式捆綁到標量上。作為這種類型的例子,下面我們給出六個示例Perl正則表達式及相應的定義:

$scalarName=~s/a/b;#substitutethecharacteraforb,andreturntrueifthiscanhappern   $scalarName=~m/a;#doesthescalar$scalarNamehaveanainit?   $scalarName=~tr/A-Z/a-z/;#translateallcapitalletterwithlowercaseones,andreturntureifthishappens   $scalarName!~s/a/b/;#substitutethecharacteraforb,andreturnfalseifthisindeedhappens.   $scalarName!~m/a/;#doesthescalar$scalarNamematchthecharactera?Returnfalseifitdoes.   $scalarName!~tr/0-9/a-j/;#translatethedigitsforthelettersathruj,andreturnfalseifthishappens

.如果我們輸入像hornedtoad=~m/toad/這樣的代碼,則出現(xiàn)圖9-1所示情況:

另外,如果讀者正在對特定變量$_進行匹配(讀者可能在while循環(huán),map或grep中使用),則可以不用!~和=~。因而,以下所有代碼都會合法:

my@elemente=('al','a2','a3','a4','a5');   foreach(@elements){s/a/b/;}

程序使@elements等于b1,b2.b3,b4,b5。另外:

while(<$FD>){printif(m/ERBOR/);}

打印所有包含error字符串的行:

if(grep(/pattern/,@lines)){print"thevariable\@lineshaspatterninit!\n";}

打印所有包含模式pattern內(nèi)容的行,這直接引入下一原則。


◆Perl正則表達式匹配。

Perl正則表達式盡在標量上匹配,注意這里標量的重要性,如果讀者試一試如下代碼:

@arrayName=('variablel','variable2');   @arrayName=~m/variable/;#looksfor'variable'inthearray?No!usegrepinstead

那么@arrayName匹配不成功!@arrayName被Perl解釋為2,于是這意味著讀者在輸入:

'2'=~m/variable/;

至少講這不能給出預想的結果。如果讀者想這樣做,輸人為:

grep(m/variable/,@arrayName);

該函數(shù)通過@arrayName中的每一個元素進行循環(huán),返回(在標量環(huán)境中)匹配的次數(shù),同時在數(shù)組環(huán)境中返回匹配元素的實際列表。

 
◆對于給定的模式串,Perl正則表達式只匹配最早出現(xiàn)的匹配項。匹配時缺省一次只匹配或替換一次。

這個原則使用稱為“回溯”的過程指出如何匹配一個給定的字符串;如果發(fā)現(xiàn)了一個局部匹配進而找到使該匹配無效的東西,Perl正則表達式在字符串中“回溯”最小的可能數(shù)量,這個數(shù)量的字符要保證不丟失任何匹配。

對于理解Perl正則表達式正在做什么,這個原則是最有幫助的一個,同時不需要與Perl一樣的形式來理解它正在做什么。假定有如下模式:'Sillypeopledosillythingsifinsillymoods'

同時想匹配如下模式:'sillymoods'

那么Perl正則表達式引擎匹配silly,接著遇到people的P,至此,Perl正則表達式引擎知道***個silly不匹配,于是Perl正則表達式引擎移到P且繼續(xù)尋求匹配。它接著遇到第二個silly,于是來匹配moods。然而得到的是字母t(在thing中),于是移到things中的t處,繼續(xù)進行Perl正則表達式匹配。當引擎遇到第三個silly并且盡力匹配moods時,匹配成功,匹配***完成。當我們遇到通配符時回溯將變得更加重要。如果在同一Perl正則表達式中有幾個通配符,且所有的通配符交織在一起,那么這里就有病態(tài)情形出現(xiàn),在這種情形下,回溯變得非常昂貴??慈缦卤磉_式:$line=m/expression.*matching.*could.*be.*very.*expensive.*/

◆*代表一個通配符,它意味著“匹配任意字符(換行符除外)零次或多次”。這個過程有可能花很長時間;如果在未匹配過的字符串末尾有可能匹配,那么引擎將發(fā)狂地回溯。為得到這方面的更多信息,請留意關于通配符方面的原則。

如果讀者發(fā)現(xiàn)類似于上面的情形,那么通配符需將Perl正則表達式分解成小功部分。換句話講,簡化自己的Perl正則表達式。

以上是“怎么實現(xiàn)Perl正則表達式匹配”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI