1、Perl正則表達式簡介
-
正則表達式的起源
1956年,論文《神經(jīng)網(wǎng)絡(luò)事件的表示法》首次提出“正則集的代數(shù)”表達式
英文名:regular expression
Ken Thompson將正則表達式引入Unix
此后廣泛應(yīng)用于Unix或者類Unix工具中
主流操作系統(tǒng)悍缠、主流開發(fā)語言都嵌入了正則表達式
-
正則表達式的定義
- 正則表達式,就是用某種模式去匹配一類字符串的一個公式
-
給定一個正則表達式和另一個字符串第喳,我們可以達到如下的目的:
給定的字符串是否符合正則表達式的過濾邏輯(稱作為“匹配”)
可以通過正則表達式,從字符串中獲取我們想要的特定部分
-
常用工具中的正則表達式
記事本中的正則表達式:查找踱稍、替換實際上就是正則表達式
World中正則表達式:查找墩弯、替換
Vi中的正則表達式:查找、替換
-
正則表達式無處不在
-
不同環(huán)境中所支持的功能可能不太一樣
-
-
正則表達式的特點
靈活性寞射、邏輯性和功能性非常的強
主要應(yīng)用對象是文本
可以迅速的用極簡單的方式達到字符串的復(fù)雜控制
對于剛接觸的人來說。比較晦澀難懂
2锌钮、Perl正則表達式的應(yīng)用
-
正則表達式的語法
一個正則表達式也稱為一個模式
-
簡單模式
如果模式匹配的對象是$_桥温,把模式寫在斜線/中
能匹配上,返回值為1梁丘,否則為0
$_ = "hello World"; if(/"World"/) {printf"It matched"};
如果匹配項本身含有斜線侵浸,使用反斜線
-
Unicode屬性
利用字符的屬性進行匹配
\p{屬性名}表示該屬性的模式
匹配空格,使用Space屬性:\p{Space}
匹配數(shù)字氛谜,使用Digit屬性:\p{Digit}
匹配十六進制數(shù)掏觉,使用Hex屬性:\p{Hex}
也可以使用\P來表示匹配不包含屬性的部分,\P{屬性}值漫,同不匹配不一樣
-
模式分組
利用小括號來進行字符串的分組
括號澳腹、反斜線、數(shù)字編號可以組成捕獲組的模式
括號內(nèi)的內(nèi)容作為元字符杨何,用反斜線后面加數(shù)字表示再此匹配
反斜線也不一定在括號后面
/(world)\3/表示匹配:worldworldworldworld
擇一匹配酱塔,使用豎線|表示匹配時候的”或“
/(hello|world)/表示匹配“hello”或“world"
-
正則表達式的應(yīng)用場合
針對所有的字符串處理,如特定字符串危虱、重復(fù)羊娃、計數(shù)、統(tǒng)計等
電話號碼匹配
姓名埃跷,郵箱匹配
3蕊玷、Perl正則表達式和元字符
-
正則表達式中的元字符
元字符是一種特殊字符
起通配作用
在他們前面加上反斜杠\,這些元字符就會失去其特殊含義
-
元字符列表
-
字符類:單字符與數(shù)字
-
字符類:空白字符
-
字符類:錨定字符
-
字符類:重復(fù)字符
-
字符類:替換字符
-
字符類:其他字符
-
-
元字符的優(yōu)先級
-
當(dāng)模式中包含多種元字符時弥雹,根據(jù)優(yōu)先級順序來判斷匹配量
-
4垃帅、Perl正則表達式的形式
-
模式匹配
得到“是否匹配”的結(jié)果,無其他操作
形式為:m/<regexp>/; 或者/<regexp>/; 或者m?<regexp>?
同匹配操作符一起剪勿,用來判斷是否匹配后面的字符串
匹配的表達式中挺智,括號部分的匹配項用$標(biāo)號表示
匹配上,返回值為1,否則為0
$test = "China"; $target = ".*ina"; $test =~ m/$target/ ##該表達式的返回值為1
$string = "This string contains the number 25.11"; $test = $string =~ /?(\d+)\.?(\d+)/; print $string."\n"; ## This string contains the number 25.11 print $test."\n"; ## 1 $a = $1; $b = $2; ? print $a."\n"; ## 25 print $b."\n"; ## 11
-
模式匹配的選項:
-
模式替換
替換操作赦颇,返回值為布爾值
形式為:s/<regexp>/<replacement>; 或者s?<regexp>?<replacement>
同匹配操作符一起二鳄,修改被替換的部分
不支持替換成特殊字符
-
模式替換的選項
$var = "0abc1"; $var =~ s/[a-zA-Z]+/3*2/e; print $var."\n"; ## 061 ? $var =~ s/[a-zA-Z]+/3*2/; print $var."\n"; ## 03*21
-
模式轉(zhuǎn)化
同模式替換類似,用以彌補模式替換的不足
形式為:tr/<regexp>/<replacement>; 或則tr?<regexp>?<replacement>
將string1中的字符依次媒怯,逐個替換為string2的字符
-
返回值為替換的字符數(shù)
$var = "abcdfghicba"; print $var."\n"; ## abcdfghicba $result = $var =~ tr/abc/def/; print $var."\n"; ## defdfghifed print $result."\n"; ## 6 print "------------------------\n";
-
模式轉(zhuǎn)換的特殊功能
大小寫轉(zhuǎn)換:$str =~ tr/a-zA-Z/A-Za-z/
特定字符的計數(shù):$str =~ tr/0-9/0-9/
-
模式轉(zhuǎn)換的選項
$var = "123abc"; print $var."\n"; ## 123abc $var =~ tr/0-9/ /c; print $var."\n"; ## 123 ? $var =~ tr/1b//d; print $var."\n"; ## 23ac ? $var = "12abc3abc"; $var =~ tr/0-9/ /cs; print $var."\n"; ## 12 3
5订讼、Perl正則表達式的原則
-
原則一:
- 正則表達式有三種不同形式,分為匹配扇苞,替換和轉(zhuǎn)化
-
原則二:
- 正則表達式僅對標(biāo)量進行匹配
-
原則三:
- 匹配時欺殿,默認(rèn)只匹配/替換一次,且對象為最早的可能匹配
-
原則四:
- 正則表達式能夠處理雙引號所能處理的任意和全部字符
-
原則五:
正則表達式在求值過程中產(chǎn)生兩種情況:結(jié)果狀態(tài)和反向引用
$a =~ m/pattern/ ##產(chǎn)生的結(jié)果狀態(tài)鳖敷,布爾類型
$a =~ s/(word1)(word2)/$2$1/ ##產(chǎn)生的反向引用
-
原則六:
正則表達式的核心能力在于通配符和多重匹配運算符
$a =~ /\w+/ ##匹配一個或多個單詞
$a =~ m/\d/ ##匹配0個或多個數(shù)字
-
原則七:
如果匹配不止一個字符集合脖苏,可以使用“|”來增加靈活性
m/(cat|dog)/ ##可以匹配cat或者dog
-
原則八:
Perl中用(?...)語法給正則表達式提供擴展功能
(?:pattern) 匹配pattern但不獲取匹配結(jié)果
(?=pattern) 正向預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串
(?!pattern) 負(fù)向預(yù)查定踱,在任何不匹配pattern的字符串開始處匹配查找字符串
-
說明:
- 在Perl的模式中棍潘,括號內(nèi)的子模式將存儲在內(nèi)存中,此功能即取消存儲該括號內(nèi)的匹配內(nèi)容