Perl中的正則表達式

1 正則表達式的三種形式

首先我們應該知道 Perl 程序中,正則表達式有三種存在形式,他們分別是:

匹配:m/<regexp>/ (還可以簡寫爲 /<regexp>/ ,略去 m)

替換:s/<pattern>/<replacement>/

轉化:tr/<pattern>/<replacemnt>/

這三種形式一般都和 =~ 或 !~ 搭配使用(其中 "=~" 表示相匹配,在整條語句中讀作 does,"!~" 表示不匹配,在整條語句中讀作 doesn't),並在左側有待處理的標量變量。如果沒有該變量和 =~ !~ 操作符,則默認爲處理 $_ 變量中的內容。舉例如下:

$str = "I love Perl";

$str =~ m/Perl/; # 表示如果在 $str 中發現 "Perl" 字符串,則返回 "1" 否則返回 "0"。

$str =~ s/Perl/BASH/; # 表示將變量 $str 中的 "Perl" 字符串替換爲 "BASH",如果發生此替換則返回 "1",否則返回 "0"。

$str !~ tr/A-Z/a-z/; # 表示將變量 $str 中的所有大寫字母轉化爲小寫字母,如果轉化發生了則返回 "0",否則返回 "1"。

另外還有:

foreach (@array) { s/a/b/; } # 此處每次循環將從 @array 數組中取出一個元素存放在 $_ 變量中,並對 $_ 進行替換處理。

while (<FILE>) { print if (m/error/); } # 這一句稍微複雜一些,他將打印 FILE 文件中所有包含 error 字符串的行。

Perl 的正則表達式中如果出現 () ,則發生匹配或替換後 () 內的模式被 Perl 解釋器自動依次賦給系統 $1, $2 ...... 請看下面的例子:

$string = "I love perl";

$string =~ s/(love)/<$1>/; # 此時 $1 = "love",並且該替換的結果是將 $string 變爲 "I <love> perl"

$string = "i love perl";

$string =~ s/(i)(.*)(perl)/<$3>$2<$1>/; # 這裏 $1 = "i",$2 = " love ",$3 = "perl",並且替換後 $string 變爲 "<perl> love <i>"

替換操作 s/<pattern>/<replacement>/ 還可以在末尾加上 e 或 g 參數,他們的含義分別爲:

s/<pattern>/<replacement>/g 表示把待處理字符串中所有符合 <pattern> 的模式全部替換爲 <replacement> 字符串,而不是只替換第一個出現的模式。

s/<pattern>/<replacement>/e 表示將把 <replacemnet> 部分當作一個運算符,這個參數用的不多。

比如下面的例子:

$string = "i:love:perl";

$string =~ s/:/*/; #此時 $string="i*love:perl";

$string = "i:love:perl";

$string =~ s/:/*/g; #此時 $string="i*love*perl";

$string =~ tr/*/ /; #此時 $string="i love perl";

$string = "www22cgi44";

$string =~ s/(\d+)/$1*2/e; # (/d+)代表 $string 中的一個或多個數字字符,將這些數字字符執行 *2 的操作,因此最後 $string 變成了 "www44cgi88"。

下面給出一個完整的例子:

#!/usr/bin/perl

print"請輸入一個字符串!\n";

$string = <STDIN>; # <STIDN>代表標准輸入,會讓使用者輸入一字符串

chop($string); # 將$string最後一個換行的字符\n刪除掉

if($string =~ /perl/){

print("輸入的字符串中有 perl 這個字符串!\n";

}

如果輸入的字符串含有 perl 這個字符串的話,就會顯示後面的提示信息。

2 正則表達式中的常用模式

下面是正則表達式中的一些常用模式。

/pattern/

結果

.

匹配除換行符以外的所有字符

x?

匹配 0 次或一次 x 字符串

x*

匹配 0 次或多次 x 字符串,但匹配可能的最少次數

x+

匹配 1 次或多次 x 字符串,但匹配可能的最少次數

.*

匹配 0 次或一次的任何字符

.+

匹配 1 次或多次的任何字符

{m}

匹配剛好是 m 個 的指定字符串

{m,n}

匹配在 m個 以上 n個 以下 的指定字符串

{m,}

匹配 m個 以上 的指定字符串

[]

匹配符合 [] 內的字符

[^]

匹配不符合 [] 內的字符

[0-9]

匹配所有數字字符

[a-z]

匹配所有小寫字母字符

[^0-9]

匹配所有非數字字符

[^a-z]

匹配所有非小寫字母字符

^

匹配字符開頭的字符

$

匹配字符結尾的字符

\d

匹配一個數字的字符,和 [0-9] 語法一樣

\d+

匹配多個數字字符串,和 [0-9]+ 語法一樣

\D

非數字,其他同 \d

\D+

非數字,其他同 \d+

\w

英文字母或數字的字符串,和 [a-zA-Z0-9] 語法一樣

\w+

和 [a-zA-Z0-9]+ 語法一樣

\W

非英文字母或數字的字符串,和 [^a-zA-Z0-9] 語法一樣

\W+

和 [^a-zA-Z0-9]+ 語法一樣

\s

空格,和 [\n\t\r\f] 語法一樣

\s+

和 [\n\t\r\f]+ 一樣

\S

非空格,和 [^\n\t\r\f] 語法一樣

\S+

和 [^\n\t\r\f]+ 語法一樣

\b

匹配以英文字母,數字爲邊界的字符串

\B

匹配不以英文字母,數值爲邊界的字符串

a|b|c

匹配符合a字符 或是b字符 或是c字符 的字符串

abc

匹配含有 abc 的字符串

(pattern)

() 這個符號會記住所找尋到的字符串,是一個很實用的語法。第一個 () 內所找到的字符串變成 $1 這個變量或是 \1 變量,第二個 () 內所找到的字符串變成 $2 這個變量或是 \2 變量,以此類推下去。

/pattern/i

i 這個參數表示忽略英文大小寫,也就是在匹配字符串的時候,不考慮英文的大小寫問題。

如果要在 pattern 模式中找尋一個特殊字符,如 "*",則要在這個字符前加上 \ 符號,這樣才會讓特殊字符失效

下面給出一些例子:

範例

說明

/perl/

找到含有 perl 的字符串

/^perl/

找到開頭是 perl 的字符串

/perl$/

找到結尾是 perl 的字符串

/c|g|i/

找到含有 c 或 g 或 i 的字符串

/cg{2,4}i/

找到 c 後面跟著 2個到 4個 g ,再跟著 i 的字符串

/cg{2,}i/

找到 c 後面跟著 2個以上 g ,再跟著 i 的字符串

/cg{2}i/

找到 c 後面跟著 2個 g,再跟著 i 的字符串

/cg*i/

找到 c 後面跟著 0個或多個 g ,再跟著 i 的字符串,如同/cg{0,1}i/

/cg+i/

找到 c 後面跟著一個以上 g,再跟著 i 的字符串,如同/cg{1,}i/

/cg?i/

找到 c 後面跟著 0個或是 1個 g ,再跟著 i 的字符串,如同/cg{0,1}i/

/c.i/

找到 c 後面跟著一個任意字符,再跟著 i 的字符串

/c..i/

找到 c 後面跟著二個任意字符,再跟著 i 的字符串

/[cgi]/

找到符合有這三個字符任意一個的字符串

/[^cgi]/

找到沒有這三個字符中任意一個的字符串

/\d/

找尋符合數字的字符,可以使用/\d+/來表示一個或是多個數字組成的字符串

/\D/

找尋符合不是數字的字符,可以使用/\D+/來表示一個或是更多個非數字組成的字符串

/\*/

找尋符合 * 這個字符,因爲 * 在常規表達式中有它的特殊意思,所以要在這個特殊符號前加上 \ 符號,這樣才會讓這個特殊字符失效

/abc/i

找尋符合 abc 的字符串而且不考慮這些字符串的大小寫

3 正則表達式的八大原則

如果在 Unix 中曾經使用過 sed、awk、grep 這些命令的話,相信對于 Perl 語言中的正則表達式(Regular Expression)不會感到陌生。Perl 語言由于有這個功能,所以對字符串的處理能力非常強。在Perl語言的程序中,經常可以看到正則表達式的運用,在 CGI 程序設計中也不例外。

正則表達式是初學 Perl 的難點所在,不過只要一旦掌握其語法,你就可以擁有幾乎無限的模式匹配能力,而且 Perl 編程的大部分工作都是掌握常規表達式。下面給大家介紹幾條正則表達式使用過程中的 8 大原則。

正則表達式在對付數據的戰鬥中可形成龐大的聯盟——這常常是一場戰爭。我們要記住下面八條原則:

· 原則1:正則表達式有三種不同形式(匹配(m/ /),替換(s/ / /eg)和轉換(tr/ / /))。

· 原則2:正則表達式僅對標量進行匹配( $scalar =~ m/a/; 可以工作; @array =~ m/a/ 將把@array作爲標量對待,因此可能不會成功)。

· 原則3:正則表達式匹配一個給定模式的最早的可能匹配。缺省時,僅匹配或替換正則表達式一次( $a = 'string string2'; $a =~ s/string/ /; 導致 $a = 'string 2')。

· 原則4:正則表達式能夠處理雙引號所能處理的任意和全部字符( $a =~ m/$varb/ 在匹配前把varb擴展爲變量;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等價于 $a =~ s/a/ /; ,執行結果使 $a = " s" )。

· 原則5:正則表達式在求值過程中産生兩種情況:結果狀態和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出現,$a =~ s/(word1)(word2)/$2$1/ 則“調換”這兩個單詞。

· 原則6:正則表達式的核心能力在于通配符和多重匹配運算符以及它們如何操作。$a =~ m/\w+/ 匹配一個或多個單詞字符;$a =~ m/\d/" 匹配零個或多個數字。

· 原則7:如果欲匹配不止一個字符集合,Perl使用 "|" 來增加靈活性。如果輸入 m/(cat|dog)/ 則相當于“匹配字符串 cat 或者 dog。

· 原則8:Perl用 (?..) 語法給正則表達式提供擴展功能。(這一點請同學們課後看相關資料)

想要學習所有這些原則?我建議大家先從簡單的開始,並且不斷的嘗試和實驗。實際上如果學會了 $a =~ m/ERROR/ 是在 $a 中查找子串ERROR,那麽你就已經比在 C 這樣的低層語言中得到了更大的處理能力。

Perl中的正則表達式
  原文出自:  http://263.aka.org.cn/Lectures/002/Lecture-2.1.2/perl-reg.html  感謝AKA及作者。  [code:1:a3e33d1336]  9 Perl 中的正則表達式  正則表達式的三種形式  正則表達式中的常用模式...查看完整版>>Perl中的正則表達式
 
PERL裏正則表達式的簡介
  一、簡介  二、匹配操作符  三、模式中的特殊字符  1、字符+  2、字符 []和[^]  3、字符 *和?  4、轉義字符  5、匹配任意字母或數字  6、錨模式  7、模式中的變量替換  8、字符範圍轉義前綴...查看完整版>>PERL裏正則表達式的簡介
 
PERL裏正則表達式的簡介
一、簡介 二、匹配操作符 三、模式中的特殊字符 1、字符+ 2、字符 []和[^] 3、字符 *和? 4、轉義字符 5、匹配任意字母或數字 6、錨模式 7、模式中的變量替換 8、字符範圍轉義前綴 9、匹配任意字符 10、匹配指定數目的...查看完整版>>PERL裏正則表達式的簡介
 
SAS9新體驗-在DATA STEP中使用perl 正則表達式支持(Regular Expressions)
sas自9版開始支持perl(Perl 5.6.1 ) 正則表達式支持,極大的方便了數據校驗的簡易性、可靠性在沒有Regular Expressions(RE)前,只能使用index,substr,tranwrd等函數對字符串進行操作,但這些函數對動態字符串的操...查看完整版>>SAS9新體驗-在DATA STEP中使用perl 正則表達式支持(Regular Expressions)
 
PHP正則表達式:PHP中的正則函數-PHP語言
PHP正則表達式主要用于字符串的模式分割、匹配、查找及替換操作。使用正則表達式在某些簡單的環境下可能效率不高,因此如何更好的使用PHP正則表達式需要綜合考慮。我的PHP正則入門,是起源于網上的一篇文章,這篇文章...查看完整版>>PHP正則表達式:PHP中的正則函數-PHP語言
 
oracle 10g中的正則表達式
 很多mysql的使用者都會臭Oracle,說連正則表達式都沒有。也記得BBS上有很多人在找oracle中的正則表達式。有個公司還專門搞了幾個jar,利用oracle內置的Java實現了它(asktom.oracle.com有介紹)。不過,隨著10g的推...查看完整版>>oracle 10g中的正則表達式
 
正則表達式概述及在JAVA中的使用
  概述    你是否使用過查找*.tmp臨時文件    你是否使用過編輯工具中的查找/替換功能    其實它們都使用了正則表達式    正則表達式的作用    提供更強大的字符串處理能力    測試字符串...查看完整版>>正則表達式概述及在JAVA中的使用
 
如何使用PHP中的正則表達式
     在PHP中正則表達式用于複雜字符串的處理。所支持的正則表達式如下:  ereg()  ereg_replace()  eregi()  eregi_replace()  split()  (1)ereg,eregi  這是正規表達式匹配函數,前者是大小寫有關...查看完整版>>如何使用PHP中的正則表達式
 
正則表達式在UBB論壇中的應用(1)
     一、讀者指引  讀者指引幫助你掌握本文的梗概。以免你看了大半才明白這編文章不適合你,給你造成視覺汙染。  如果你正在用ASP寫程序,或者你正在寫一些諸如BBS、留言溥或表單數據檢查之類的東東那...查看完整版>>正則表達式在UBB論壇中的應用(1)
 
 
回到王朝網路移動版首頁