1、Perl正則表達(dá)式簡(jiǎn)介
-
正則表達(dá)式的起源
1956年,論文《神經(jīng)網(wǎng)絡(luò)事件的表示法》首次提出“正則集的代數(shù)”表達(dá)式
英文名:regular expression
Ken Thompson將正則表達(dá)式引入U(xiǎn)nix
此后廣泛應(yīng)用于Unix或者類Unix工具中
主流操作系統(tǒng)、主流開發(fā)語言都嵌入了正則表達(dá)式
-
正則表達(dá)式的定義
- 正則表達(dá)式,就是用某種模式去匹配一類字符串的一個(gè)公式
image.png-
給定一個(gè)正則表達(dá)式和另一個(gè)字符串,我們可以達(dá)到如下的目的:
給定的字符串是否符合正則表達(dá)式的過濾邏輯(稱作為“匹配”)
可以通過正則表達(dá)式,從字符串中獲取我們想要的特定部分
-
常用工具中的正則表達(dá)式
記事本中的正則表達(dá)式:查找、替換實(shí)際上就是正則表達(dá)式
World中正則表達(dá)式:查找、替換
Vi中的正則表達(dá)式:查找、替換
-
正則表達(dá)式無處不在
-
不同環(huán)境中所支持的功能可能不太一樣
image.png
-
-
正則表達(dá)式的特點(diǎn)
靈活性、邏輯性和功能性非常的強(qiáng)
主要應(yīng)用對(duì)象是文本
可以迅速的用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制
對(duì)于剛接觸的人來說。比較晦澀難懂
2、Perl正則表達(dá)式的應(yīng)用
-
正則表達(dá)式的語法
一個(gè)正則表達(dá)式也稱為一個(gè)模式
-
簡(jiǎn)單模式
如果模式匹配的對(duì)象是$_,把模式寫在斜線/中
能匹配上,返回值為1,否則為0
$_ = "hello World"; if(/"World"/) {printf"It matched"};
如果匹配項(xiàng)本身含有斜線,使用反斜線
-
Unicode屬性
利用字符的屬性進(jìn)行匹配
\p{屬性名}表示該屬性的模式
匹配空格,使用Space屬性:\p{Space}
匹配數(shù)字,使用Digit屬性:\p{Digit}
匹配十六進(jìn)制數(shù),使用Hex屬性:\p{Hex}
也可以使用\P來表示匹配不包含屬性的部分,\P{屬性},同不匹配不一樣
-
模式分組
利用小括號(hào)來進(jìn)行字符串的分組
括號(hào)、反斜線、數(shù)字編號(hào)可以組成捕獲組的模式
括號(hào)內(nèi)的內(nèi)容作為元字符,用反斜線后面加數(shù)字表示再此匹配
反斜線也不一定在括號(hào)后面
/(world)\3/表示匹配:worldworldworldworld
擇一匹配,使用豎線|表示匹配時(shí)候的”或“
/(hello|world)/表示匹配“hello”或“world"
-
正則表達(dá)式的應(yīng)用場(chǎng)合
針對(duì)所有的字符串處理,如特定字符串、重復(fù)、計(jì)數(shù)、統(tǒng)計(jì)等
電話號(hào)碼匹配
姓名,郵箱匹配
3、Perl正則表達(dá)式和元字符
-
正則表達(dá)式中的元字符
元字符是一種特殊字符
起通配作用
在他們前面加上反斜杠\,這些元字符就會(huì)失去其特殊含義
-
元字符列表
-
字符類:?jiǎn)巫址c數(shù)字
image.png -
字符類:空白字符
image.png -
字符類:錨定字符
image.png -
字符類:重復(fù)字符
image.png -
字符類:替換字符
image.png -
字符類:其他字符
image.png
-
-
元字符的優(yōu)先級(jí)
-
當(dāng)模式中包含多種元字符時(shí),根據(jù)優(yōu)先級(jí)順序來判斷匹配量
image.png
-
4、Perl正則表達(dá)式的形式
-
模式匹配
得到“是否匹配”的結(jié)果,無其他操作
形式為:m/<regexp>/; 或者/<regexp>/; 或者m?<regexp>?
同匹配操作符一起,用來判斷是否匹配后面的字符串
匹配的表達(dá)式中,括號(hào)部分的匹配項(xiàng)用$標(biāo)號(hào)表示
匹配上,返回值為1,否則為0
$test = "China"; $target = ".*ina"; $test =~ m/$target/ ##該表達(dá)式的返回值為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-
模式匹配的選項(xiàng):
image.png
-
模式替換
替換操作,返回值為布爾值
形式為:s/<regexp>/<replacement>; 或者s?<regexp>?<replacement>
同匹配操作符一起,修改被替換的部分
不支持替換成特殊字符
-
模式替換的選項(xiàng)
image.png$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)化
同模式替換類似,用以彌補(bǔ)模式替換的不足
形式為:tr/<regexp>/<replacement>; 或則tr?<regexp>?<replacement>
將string1中的字符依次,逐個(gè)替換為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/
特定字符的計(jì)數(shù):$str =~ tr/0-9/0-9/
-
模式轉(zhuǎn)換的選項(xiàng)
image.png$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正則表達(dá)式的原則
-
原則一:
- 正則表達(dá)式有三種不同形式,分為匹配,替換和轉(zhuǎn)化
-
原則二:
- 正則表達(dá)式僅對(duì)標(biāo)量進(jìn)行匹配
-
原則三:
- 匹配時(shí),默認(rèn)只匹配/替換一次,且對(duì)象為最早的可能匹配
-
原則四:
- 正則表達(dá)式能夠處理雙引號(hào)所能處理的任意和全部字符
-
原則五:
正則表達(dá)式在求值過程中產(chǎn)生兩種情況:結(jié)果狀態(tài)和反向引用
$a =~ m/pattern/ ##產(chǎn)生的結(jié)果狀態(tài),布爾類型
$a =~ s/(word1)(word2)/$2$1/ ##產(chǎn)生的反向引用
-
原則六:
正則表達(dá)式的核心能力在于通配符和多重匹配運(yùn)算符
$a =~ /\w+/ ##匹配一個(gè)或多個(gè)單詞
$a =~ m/\d/ ##匹配0個(gè)或多個(gè)數(shù)字
-
原則七:
如果匹配不止一個(gè)字符集合,可以使用“|”來增加靈活性
m/(cat|dog)/ ##可以匹配cat或者dog
-
原則八:
Perl中用(?...)語法給正則表達(dá)式提供擴(kuò)展功能
(?:pattern) 匹配pattern但不獲取匹配結(jié)果
(?=pattern) 正向預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串
(?!pattern) 負(fù)向預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串
-
說明:
- 在Perl的模式中,括號(hào)內(nèi)的子模式將存儲(chǔ)在內(nèi)存中,此功能即取消存儲(chǔ)該括號(hào)內(nèi)的匹配內(nèi)容











