精簡扼要的Perl 課程講義(六):常規表達式(Regular ...

文章推薦指數: 80 %
投票人數:10人

常規表達式(一) (Regular expression) # (1) 基本樣式比對"=~" 與"!~" # 比對字串,成功傳回true # 失敗傳回false "Hello World" =~ /World/; ... Blogger舊站 關於 Facebook Flickr 物聯網 網站架設 程式設計 統計 素食 特價優惠 宗教 物聯網 網站架設 程式設計 統計 素食 特價優惠 宗教 精簡扼要的Perl課程講義(六):常規表達式(RegularExpression) 2015/04/23 3則留言 常規表達式(一) #常規表達式(一)(Regularexpression) #(1)基本樣式比對"=~"與"!~" #比對字串,成功傳回true #失敗傳回false "HelloWorld"=~/World/; $string="HelloWorld!"; #若比對成功,則print print"Itmatches\n"if$string=~/World/; #若比對失敗,則print print"Itdoesn'tmatch\n"if$string!~/World/; $_="HelloWorld"; #不指定比對目標,預設為$_ print"Itmatches\n"if/World/; #大小寫不同,比對失敗 "HelloWorld"=~/world/; #空白字元也視為一般字元,比對成功 "HelloWorld"=~/oW/; #比對失敗 "HelloWorld"=~/World/; #(2)自訂分隔字元 #等同於"HelloWorld"=~/World/; "HelloWorld"=~m!World!; "HelloWorld"=~m{World};#Thesame #比對成功,'/'現在變成一般字元 "/usr/bin/perl"=~m"/perl"; #(3)中介字符(metacharacter)與字符集(characterclass) #^:比對行首 "HelloWorld"=~/^Hello/;#比對成功 #比對失敗,因為World不在行首 "HelloWorld"=~/^World/; #$:比對行尾 "HelloWorld"=~/World$/;#比對成功 #比對失敗,因為World不在行尾 "HelloWorld"=~/Hello$/; #.:比對除了換行(\n)以外的任意一個字元 "HelloWorld"=~/Wo.ld/;#比對成功 #*:比對其前一個項目零次以上(asmanyaspossible) #+:比對其前一個項目一次以上(asmanyaspossible) #?:比對其前一個項目零次或一次(asmanyaspossible) "HelloWorld"=~/Hel*o/;#l*代表'l'零次以上,比對成功 "HelloWorld"=~/Hel+o/;#l*代表'l'一次以上,比對成功 #.*代表任意字元零次以上,比對成功, #但Perl所比對的結果是: #'Thatisacat,notahat'不是'That' "Thatisacat,notahat."=~/T.*at/; #加入'?'使比對到的資料越短越好, #此時Perl所比對的結果是:'That' "Thatisacat,notahat."=~/T.*?at/; #[]:比對中括號中任意一個字符 #比對開頭是A或B或C,比對失敗 "Hat"=~/^[ABC]/; #比對開頭是A或B或C或D,比對成功 "Cat"=~/^[A-D]/; #[^]:與[]相反,比對不在中括號中任意一個字符 #^[^ABC]比對開頭不是A或B或C的,比對成功 "Hat"=~/^[^ABC]/; #比對非英文字結尾,比對成功 "HelloWorld."=~/[^A-Za-z]$/; #|:比對任意一組字符 #比對cat或dog,比對成功 "Maryhasacat."=~/cat|dog/; #{}:指定前一個項目出現的次數 #l{1,3}代表'l'一到三次,比對成功 "HellloWorld"=~/Hel{1,3}o/; #l{2,}代表'l'兩次以上,比對成功 "HellloWorld"=~/Hel{2,}o/; #l{2}代表'l'兩次,比對失敗 "HellloWorld"=~/Hel{2}o/; #\b:比對單字邊界 #\B:比對非單字邊界 #比對Hello這個單字,比對成功 "HelloWorld"=~/\bHello\b/; #比對Hello這個單字,比對失敗 "Helloworld"=~/\bHello\b/; #比對成功 "Helloworld"=~/\bHello\B/; #比對word這個單字,比對成功 'Thisisa"word".'=~/\bword\b/; #\w:word[a-zA-Z0-9_] #\W:non-word[^a-zA-Z0-9_] #\s:space[\t\n\r\f\v] #\S:non-space[^\t\n\r\f\v] #\d:digit[0-9] #\D:non-digit[^0-9] "HelloWorld"=~/^\w+\W\w+$/;#比對成功 #Reference:perlre(1) 常規表達式(二) #常規表達式(二) #(1)s///取代 $_="HelloWorld.\n"; s/World/Bill/;#取代Hello成Bill print;#HelloBill. $_="HelloWorld.\n"; $word="World"; s/$word/Bill/;#可內嵌變數 print; #(2)使用()儲存變數 $_="EveryDogHasIt'sDay."; #比對行首的第一個與第二個字,並儲存至變數$1與$2 /^(\w+)\W+(\w+)/; print"Thefirst2wordsare:$1and$2"; $_="EveryDogHasIt'sDay."; s/(\w+)//g; print;#'. $_="barbarian"; s/(\w+)\1/$1/;#抓出重複的地方,去掉重複的地方 print;#barian #(3)Modifiers #g:Matchglobally,i.e.,findalloccurrences. $_="HelloWorld.\n"; s/l//;#只取代第一個'l' print;#HeloWorld. $_="HelloWorld.\n"; s/l//g;#取代所有的'l' print;#HeoWord. #i:Docase-insensitivepatternmatching. #忽略大小寫差別,比對成功 "HelloWorld"=~/helloworld/i; #o:Compilepatternonlyonce. $word="something"; while($something){ #something... s/$word/$another/o;#加入'o',只編譯一次,可加快執行效率 #something... } $str="abcdefg\n"; $str=~s/($_)//ofor('c'..'f'); print$str;#ab<<<>>>defg,似乎不是我要的 #m:Treatstringasmutiplelines. #Thatis,change"^"and"$"frommatchingthe #startorendofthestringtomatchingthestart #orendofanylineanywherewithinthestring. $_="abc\ndef\nghi\n"; s/^(.)/\u$1/mg;#把行首第一個字母變大寫 print;#結果正確,"Abc\nDef\nGhi" $_="abc\ndef\nghi\n"; s/^(.)/\u$1/g;#若沒有加上m print;#結果變成,"Abc\ndef\nghi" $_="abc\ndef\nghi\n"; s/(.)$/\u$1/mg;#同理 print;#結果為,"abC\ndeF\nghI" #s:Treatstringassingleline.Thatis, #change"."tomatchanycharacterwhatsoever, #evenanewline,whichnormallyitwouldnotmatch. $_="abc\ndef\nghi\n"; #加入s,使'.'可比對"\n",比對成功。

print"Matched"if/a.*i/s; #不加s,則比對失敗。

print"Matched"if/a.*i/; 繼續閱讀:Perl程式設計教學 Perl G.T.Wang 個人使用Linux經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

3留言 新增留言→ gimi65536 感謝!這篇文章對我理解regex有很大幫助~ 不過文內\w與\W的部份,\w好像是包含數字0-9的 print“match”if“123”=~/\w/;#會印出match 2018/01/07 回覆 G.T.Wang 應該是我漏寫了,已修正。

2018/01/08 回覆 Z.Z.Huang 謝謝您的整理, 幫助很大。

2018/12/23 回覆 LeaveaReply取消回覆 留言* Name* Email* Website 搜尋 分類Arduino(5) BeagleBoneBlack(1) DIY(54) Linux(317) macOS(33) Octave(15) Perl(12) R(47) Windows(98) WordPress(16) 個人(15) 免費(35) 兒童(30) 實用工具(85) 手機(13) 技巧(45) 有趣(99) 樹莓派(57) 物聯網(55) 玄學(11) 生活(209) 程式設計(137) 統計學(8) 網頁空間(36) 網頁開發(128) 虛擬化(7) 農業(42) 遊戲(9) 開箱(132) 雲端(4) 宗教 如何戒邪淫、遠離婚外情 戒淫寶典:《壽康寶鑑》白話有聲書 公益 台灣世界展望會 家扶基金會 智邦公益網 igiving公益網 Yahoo奇摩公益 ©2022G.T.Wang



請為這篇文章評分?