learning perl(四) 正則表達式

perl 的核心,也是最重要的一點就是正則表達式了,也叫做模式,是一個匹配字符串的模板。有了它,可以更好地處理文本。


1)簡易模式。 的使用簡單正則表達式,其實就是對字符串進行匹配。比如這樣:

while (<>) {

chomp;

if (/pattern/) {

print "matched!";

}

}

此時perl會將讀入的一行存進$_,然後對其進行'/ /' 中的模式進行匹配,如果是/love/,就是檢查輸入中有沒有出現‘love’。

如果只能匹配這樣的字符串,那就太沒意思了,所以,perl中有一些特殊的通配符,常用的有'.' ,可以匹配任何一個字符(除了換行\n),在搭配上一些量詞,功能就很強大了,比如‘*’(前面的內容出現0-n次) '+' (出現1-n次) '?'(出現0或者1次)  ‘{n}’(直接指定出現n次)。最常用的比如 .* 表示任意字符任意次(除了換行\n)。

可以在匹配中加入括號表示分組,/(love)+/,意思應該一目瞭然,代表love出現1-n次,特殊作用就是反向引用,像這樣/(.)(.)\2\1/ 可以表示abba這樣的字符,數字代表與相應括號中的字符的重複。更加安全的寫法是/(.)(.)\g{2}\g{1}/。

擇一匹配,/hi|hello/,使用豎線‘|’ 可以表示或,有一個匹配到就成功。

爲了我們更方便的工作,perl 加入了很多字符集,以節約我們的按鍵,常用的比如:

[A-Za-z0-9_] => \w ,可以更好的匹配任何單詞,有字母數字下劃線組成。

[0-9] => \d,表示數字。

[\f\t\n\r ] => \s,表示空白。

相應的大寫版本\W \D \S ,表示除他們之外的任意字符,脫字符^ 表示除什麼之外的任意字符。另外,[\d\D] 會匹配任何字符(包括換行符\n).


2.更強的匹配。 

下面我們將對簡易模式進行增強,首先,/ / 匹配其實是m/ / 的縮寫,也可以使用m# #,m& &,都是可以的。

可以使用可選修飾符對正則表達式進行修飾,放在/ /結尾的定界符的右邊。

/ /i 表示大小寫無關的匹配

/ ./s 將點號匹配任意字符,特別是換行符\n

/ /x 隨意加入空白,目的是更好讀,易於理解

當然,這三個修飾符可以進行任意組合,比如/ /six


對單詞的處理,可以使用錨位。如/^hello.*hi$/表示匹配以hello開始,hi結尾的一行,其中^與$分別表示字符串的開頭和結尾。

更小範圍的,可以使用/\bhello\b/匹配純正的單詞hello,\B意思相反。

默認情況下匹配的是$_,綁定操作符 =~ 可以用左邊的字符串來匹配。如 if ($line =~ /\bhello/),如果匹配到會返回真。


上面所講到的正則表達式只能進行匹配,而無法對匹配的字符進行處理,想要更高級的功能可以使用捕獲變量,使用()來捕獲變量進行處理。

如 if ($line =~ /(hello) (hi)/) {

print "$1 $2\n";

}

其中$1 $2 分別按順序表示在圓括號中捕獲的字符串,這裏分別是hello hi。

捕獲到的變量不會永久存在,也就是隻能在這一次捕獲成功的地方使用$n,它的值會保存到直到下一次成功的捕獲,如果想多次使用,可以先放進變量中,如:$val = $1。

只要加了圓括號就啓動了捕獲功能,如果不想讓它捕獲可以這樣,/(?:hello)(hi)/,現在$1就表示hi。

如果加入圓括號太多可能讓人眼花繚亂,可以使用命名捕捉,這樣:

if ($line =~ /(?<name1>) (?<name2>)/) {

print "$+{name1} $+{name2} \n";

}

perl中有三個捕獲變量不使用圓括號,它將字符分成三部分,分別是$&,$`, $',分別表示捕捉到的字符,前面部分的和後面部分的字符。

模式測試程序,檢查某些字符串是否能被指定的模式匹配:

#!usr/bin/perl

while (<>) {

chomp;

if (/pattern/) {

print "Matched: |$`<$&>$'|\n";

} else {

print "No match:|$_|\n";

}

}


3.更強大的文本處理

a).替換  while (<>) {

if ($times = ($_ =~ s/a/b/g)) {

}

}

將$_中的a替換成b,並且返回替換的次數放在$times,s///g之後的g表示全局替換。除了進行替換外還可以統計文本中字符出現的次數。

b)分割和膠水函數.

可以使用split分割函數拆開一個字符串,如:@arr = split /:/, "a:b:cd";此時@arr中存儲三個元素,分別是a b cd。另外,split會保留開頭的空字段,而省略結尾的空字段。如果要以空白分割,更常見的是:@arr = split; 就這樣的簡單。

有了分割,就有膠水函數進行聯合。如:$line = join ":", a, b, cd; $line存儲“a:b:cd”。


正則表達式非常的強悍,這裏只寫出我知道冰山一角,想要學好正則表達式,可以參考《Mastering Regular Expression》(精通正則表達式)。奮鬥

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章