Perl正則表示式(1) - 正則表示式基礎知識
阿新 • • 發佈:2018-12-15
Perl正則表示式
1. 基礎知識
- Perl中正則表示式(regular expression)預設匹配 $_ 中的字串,匹配成功就返回真,否則返回假;
- Perl匹配正則表示式時,可以使用變數內插,先完成變數內插,取出變數中的字串後,編譯正則表示式。
1.1 regex中的萬用字元
- 點號 . (元字元)
- 可以匹配除換行符 \n 之外的任意單個字元;
- 點號 . 代表的不是它字元本身,但是可以匹配點這個字元(可以匹配自己)
- 只想匹配單個點 . 字元,可以先用反斜線轉義 .
- 如果不喜歡使用點 . ,可以使用\N,效果一致 (後面介紹\N的含義)
1.2 regex中的量詞
- Perl中用到的常見量詞包括 * + ? ,其具體含義見下表。
表1.2 正則表示式量詞以及對應的廣義形式
匹配次數 | 元字元 | 廣義寫法 | 示例 | 說明 |
---|---|---|---|---|
可有可無 | ? | {0,1} | /ab?a/ | 字元b可以出現一次或者不出現 |
零次或多次 | * | {0,} | /ab*a/ | 字元b可以不出現或者出現多次 |
一次或多次 | + | {1,} | /ab+a/ | 字元b可以出現一次或者出現多次 |
最少n次 | {3,} | /ab{3,}a/ | 字元b至少出現三次 | |
指定重複範圍 | {2,5} | /ab{2,5}a/ | 字元b出現2~5次 | |
指定準確次數 | {8} | /ab{8}a/ | 字元b只能出現8次 |
1.3 regex中的模式分組
- perl中我們可以使用圓括號()將模式字元分組,所以圓括號也是元字元。
- 在此之前,量詞只作用於它之前的那個字元,使用()進行模式分組以後,此時量詞對應要重複的就是()圍起來的部分,比如/(fred)+/,可以匹配fredfredfred這樣的字元。
- 可以反向引用圓括號()中匹配的字元,我們可以取得()中匹配的結果,又稱這種分組為捕獲分組。
表1.3 模式分組匹配示例及相關說明 (以字串"abbbabbb"為例)
示例字串 | 示例 | 匹配結果 | 情況說明 |
---|---|---|---|
abba | /(.)\1/ | 匹配第一個"bb" | (.)為模式分組,\1為捕獲分組 |
yabb dabb | /y(…) d\1/ | 匹配整個字串 | ()圓括號中可以包含多個字元,\1表示反向引用第一組模式 |
yabba dabba | /y(.)(.)\2\1/ | 匹配’abba’ | \2表示反向引用第二組模式分組(第二組圓括號中匹配的字元) |
yabba dabba | /y((.)(.)\3\2) d\1/ | 匹配整個字串 | 反向引用中的數字指的是第幾個左方括號中的內容 |
aa11bb | /(.)\g{1}11/ | 匹配’aa11’ | \g{n}中的n指的是反向引用第n個左圓括號中的內容 (絕對位置) |
aa11bb | /(.)\g{-1}11/ | 匹配’aa11’ | \g{n}中的n指的是反向引用左側最靠近它的第n個左圓括號中的內容(相對位置) |
1.4 regex中的擇一匹配
- 模式中的豎線字元 | ,也叫作或,表示擇一匹配,要麼左側部分匹配,要麼右側部分匹配(左側優先)
#!/usr/bin/perl
#包含兩個操作符
foreach (qw/fred betty barney dino/) {
if (/fred|betty/) {
print "$_\n";
}
}
#Result
fred
betty
#包含三個操作符
foreach (qw/fred betty barney dino/) {
if (/fred|betty|barney/) {
print "$_\n";
}
}
#Result
fred
betty
barney
#其他使用方式
if (/fred|betty barney/) #匹配fred或batty barney,等於/fred|(betty barney)/的結果
if (/(fred|betty) barney/) #使用圓括號限制可選區域,匹配fred barney 或 betty barney
if (/fred( |\t)+barney/) #可以匹配fred和betty之間至少有一個以上空格或者製表符
if (/fred( +|\t)barney/) #fred和barney之間有一個以上空格或者一個製表符時匹配成功
1.5 regex中的字符集
- 模式中的字符集是指單個位置上能匹配的各種模式字元的集合,我們可以把這些字元歸集到方括號中,比如[abcdef],只要某個位置上出現的字元是這6個字元中的任意一個,就算匹配成功。
- 為了定義方便,我們可以使用連字元(-)指定範圍如[a-zA-Z]表示所有英文字母的大小寫,[0-9]表示所有數字等
- 字符集中如果需要匹配連字元本身:
- 要麼轉義[a-z],只匹配a,連字元,z三個字元;
- 要麼將連字元寫在首位處,如[-a],[b-]
- 某些時候,反過來指定要排除匹配的字元更為方便,那麼只需要在字符集內部的開頭加上脫字元^
- [^def] #任何一個不是d e f的字元
- [^n-z] #小寫 n 到 z 的所有字元都不行,其他字元可以
- [^n\-z] #小寫字元 n z 和連字元 - 不可以,其他都可以
- 字符集的簡寫
表1.5 字符集的簡寫及對應的反義形式
簡寫 | 匹配 | 說明 |
---|---|---|
\d | 十進位制數字 | 匹配數字0 ~ 9 |
\D | 非十進位制數字 | 匹配數字0 ~ 9之外的其他字元 |
\s | 空白字元 | [\f\t\n\ ]等字元(未完待續) |
\S | 非空白字元 | 除[\f\t\n\ ]之外的字元 |
\h | 水平空白字元 | [\t\ ] v5.10開始支援 |
\H | 非水平空白字元 | [\t\ ]之外的其他字元 v5.10開始支援 |
\v | 縱向空白字元 | (待補充) |
\V | 非縱向空白字元 | (待補充) |
\R | 一般化的行結尾字元 | 包含\n, \r\n 及Unicode中定義的換行符 |
\w | 單詞字元 | 單詞包括字母,數字,下劃線 |
\W | 非單詞字元 | 字母,數字,下劃線之外的字元 |
\n | 換行符 | 不是真正意義的簡寫,就是一個字元 |
\N | 非換行符 | 換行符之外的任意字元,和 點 . 一致 |