1. 程式人生 > >正則表示式-2(匹配)

正則表示式-2(匹配)

-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-----------------------------------------------------------------------------------------------------------------