1. 程式人生 > >Perl正則表示式(1) - 正則表示式基礎知識

Perl正則表示式(1) - 正則表示式基礎知識

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中我們可以使用圓括號()將模式字元分組,所以圓括號也是元字元。
  1. 在此之前,量詞只作用於它之前的那個字元,使用()進行模式分組以後,此時量詞對應要重複的就是()圍起來的部分,比如/(fred)+/,可以匹配fredfredfred這樣的字元。
  2. 可以反向引用圓括號()中匹配的字元,我們可以取得()中匹配的結果,又稱這種分組為捕獲分組

表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 非換行符 換行符之外的任意字元,和 點 . 一致