正則表示式-2(匹配)
阿新 • • 發佈:2019-02-06
-1-----------------------------------------------------------------------------------------------------------------
1.用m//進行匹配:
m//(pattern match operator,模式匹配操作符)
還可以選擇其界定符號,m(test),m<test>,m{test},m[test],m,test,m!test!.
是不是看到這麼的界定符有點暈了吧,其實我們選擇一個常用的就可以了或你喜歡的界定符號。
2.模式修飾符:
perl有好幾個模式修飾符(modifier),有時候也叫標誌(flag),它們是一種追加在模式表達末尾定界符後面的的字母,用來
修改預設的匹配行為。
2.1.用/i進行大小寫無關的匹配
print "Would you like to play a game? ";
chomp($_=<STDIN>);
if(m/yes/i) # 進行大小寫無關的匹配
{
print "In that case, I recomment that you go bowling.\n";
}
2.2.用/s匹配任意字元
預設情況下,點號(.)無法匹配行行,這對於大多數單行匹配情況下是合適的。但如果字串出現換行符,而你希望點能
匹配這些換行符,那麼/s修飾符就可以完成這個換行符的匹配。
$_='I saw Barney\ndown at the boling alley\nwith Fred\nlast night.\n';
if(/Barney.*Fred/)
{
print "That string mentions Fred after Barney\n";
}
2.3.用/x加入空白符
第三個修飾符允許我們在模式裡隨意加空白符,從而使他更容易閱讀,理解:
/-?[0-9]+\.?[0-9]*/ #擠在一起,難閱讀
/ -? [0-9]+ \.? [0-9]*/x #加入空白好多了
/
-? #一個可有可無的符號
[0-9]+ #小數點前必須出現一個或多個數字
\.? #一個可有可無的小數點
[0-9]* # 小數點後面的數字,有沒有都沒有關係
/x
2.4.組合選項修飾符:
if(/barney.*fred/is) #同時使用/i and /s
{
print "Taht string metnions fred after Barney\n";
}
if(m{
barney # barney
.* #任意字元
fred #fred
}six) {#同時使用 /s , /i /x
print "That string mentions Fred after Barney\n";
}
-1-----------------------------------------------------------------------------------------------------------------
-2-----------------------------------------------------------------------------------------------------------------
字元解釋符方式:
三種字元解釋符:
ACSII 修飾符/a 它會告訴perl僅在ASCII範圍內闡釋\w,\d和\s等字符集。
Unicode 修飾符/u 它會告訴perl僅對上面這寫簡寫採用寬泛的匹配方式,只要是Unicode範圍內定義的單詞,數字,空白,都能匹配。
locale 修飾符/l 它會告訴perl按照本地化設定闡釋簡寫的意義,所以任何一個本地設定的字元編碼認為是單詞的字元 ,都會被\w簡寫匹配。
/\w+/a #僅僅是A-Z,a-z,0-9,_這些字元
/\w+/u #任何Unicode當中定義單詞的字元
/\w+/l #類同於ASCII的版本,但單詞的定義取決於本地化設定,所以如果設定為Latin-9的話
chr() 函式,轉換字元
-2-----------------------------------------------------------------------------------------------------------------
-3-----------------------------------------------------------------------------------------------------------------
錨位:
\A 錨位匹配字串的絕對開頭 ,如果開頭位置上不匹配,是會順移下一個位置繼續嘗試。
m{\Ahttps?://}i
\z 錨位匹配字串絕對末尾。
m{\.png\z}i
\Z 行末錨位,它允許後面出現換行符
脫字元:
^:表示字串開頭錨位
$: 表示字串結尾
/fred$/
/^barney/
單詞錨位:
錨位不侷限於字串首尾,比如\b是單單詞邊界錨位,它匹配任何單詞的首尾。
/\bfred\b/ #可匹配fred, 無法匹配frederic,alfred
\b 錨位匹配的是一組連續的\w字元的開頭或結尾。
that 's a "word" bondary
-3-----------------------------------------------------------------------------------------------------------------
-4-----------------------------------------------------------------------------------------------------------------
繫結操作符=~
預設情況下匹配的操作物件是$_,繫結操作符(bingding operator, =~)會告訴perl,拿右邊的模式來匹配左邊的字串,而不是
匹配$_.
my $some_ohter = "I dream of betty rubble.";
if(#some_ohter =~ /\brubble/)
{
print "Aye,there's the rub.\n";
}
模式中的內插
正則青表示式內部可以進行雙引號形式的插入。
my $what = 'larry';
while(<>)
{
if(/\A($what)/)
{
print "We waw $what in beging of $_\n";
}
}
不管$what的內容是什麼,當我們進行模式匹配時,該模式會由$what的值決定。在這裡,它等效於/\A(larry)/,也就在每行開
頭尋找larry.
-4-----------------------------------------------------------------------------------------------------------------
-5-----------------------------------------------------------------------------------------------------------------
捕獲變數
圓括號出現的地方一般都會觸發正則表示式引擎捕獲匹配到的字串。捕獲組會把匹配圓括號中模式的字串儲存到相應的地方。
既然這些捕獲變數儲存的是字串,那就說明白它是標量。 在perl裡的名稱就是$1,$2這樣的形式儲存它們的結果。
$_='Hello there, neighbor';
if(/\s([a-zA-Z]+),/)
{
print "$1\n"; #result 捕獲空白符和逗號之間的單詞
}
捕獲變數的存續期
捕獲變數通常能存活到下次成功匹配為止。也就是說,失敗的匹配不會改動上次成功匹配時捕獲的內容,而成功的匹配匹配會將它們的重置。
不捕獲模式
(?:) 匹配但捕獲結果
if(/(?:bronto)?saurus (steak|burger)/)
{
print "Fred wants a $1\n";
}
命名捕獲
(?<LABLE>PATTERN),其中LABLE可以自行命名。
訪問變數: $+{LABLE}
my $names = 'Fed or Barney';
if($names = ~m/?<name1>\w+ (?:and|or) (?<name2>\w+)/)
{
say "I saw $+{name1} adn $+{name2}\n";
}
自動捕獲變數
$` 匹配區段之前的的內容
$' 匹配到區段之後的內容
$& 匹配整個區段的內容
-5-----------------------------------------------------------------------------------------------------------------
-6-----------------------------------------------------------------------------------------------------------------
優先順序
1.最高階是圓括號("()"),用於分組和捕獲。圓括號裡的東西總是比其他東西更有緊密性。
2.第二級量詞,也就是重複操作符:*, +,?,以及花括號表示的量詞,比如{5,15},{3,} and {5}
3.第三級是錨位和序列.\A,\Z,\z, ^, \b and \B
4.第四級是擇一豎線(|),由於它位於優先順序表底部,所以從效果上來看,它會把各種模式拆分成數個元件
圓括號(分組或捕獲) (...),(?:...),(?<LABLE>...)
量詞 a*,a+,a?,a{n,m}
錨位 abc,^,$, \A,\b,\z,\Z
擇一 a|b|c
原子 a,[abc],\d,\1,\g{2}
-6-----------------------------------------------------------------------------------------------------------------