Linux平臺上被廣泛使用的正規表示式庫PCRE - Perl-compatible regular expressions,從其名字即可知道,PCRE提供的是一套與Perl中相相容的正規表示式。
元字元(Meta-character)
- '\' : 在任何元字元前面加上反斜線,就會使它失去元字元的特殊作用。例如/3\.1415/這個模式裡沒有萬用字元
- '^' : 匹配行首;在字符集中它是脫字元,表示求補集
- '$' : 匹配行尾(或結尾處新行之前字元)
- '.' : 除新行(newline)外的任一字元('/s'選項將使'.'匹配新行字元)
- '|' : 或,表示左邊匹配或右邊匹配都可以
- '('與')' : 分組,例如 “/(fred)+/” 可匹配“fredfredfred”這樣的字串
- '['與']' : 字元類。表示一類字符集合中任意一個,方括號內可使用'-'表示範圍,如[0-9]表示匹配數字0到9; 也可使用'^‘表示求補集,如[^0-9]表示除數字0到9外的其他字元
下面量詞中的前三個字元也是元字元
量詞(Quantifier)
- '*' : 0或任意次。例如“\t*”表示0到任意多個字表符;“.*”撿破爛模式,它能通吃所有的字串
- '+' : 1或更多次
- '?' : 0或1次
- {n} : n次
- {n,} : 至少n次
- {n, m} : n到m次。例如“/a{5,15}/”可以匹配重複5到15次的字母a
自動匹配變數
- $`: 匹配部分的前一部分存放在$`之中,後面的符號在鍵盤左上方與“ ~ ”在一個鍵上
- $&:整個被匹配上的部分儲存在這個變數中
- $':這個變數儲存了字串中剩下的部分,即除了匹配部分的前一部分,被匹配上的部分後剩下的部分。
匹配方式
- 貪婪(greedy)方式:在模式其餘部分匹配前提下,儘可能多地匹配字元。
貪婪量詞:+和*
- 非貪婪匹配(minimum): 對於每一個貪婪的量詞,都有一個非貪婪的量詞。以加號(+)為例, 我們可以改用非貪婪的量詞+?,這表示一次或更多匹配(加號的本意)。但是匹配的字串卻 是越短越好,而不再是越長越好。
非貪婪量詞:+?和*?
- 佔有式:與貪婪方式相近,儘可能多地匹配字元,但絕不回退(backtrack,即使模式其餘部分無法匹配,也不減少本部分的匹配數量)。在數量詞之後使用'+'表示使用佔有式匹配。
轉義序列
- '\t' : 製表符(HT, TAB)
- '\n' : 換行(LF, NL)
- '\r' : 回車(CR)
- '\f' : 進紙(Form Feed, FF)
- '\a' : 報警 (Alarm, BEL)
- '\e' : 轉義(ESC)
- "\0xx" : 八進位制數值對應字元,如\033表示ESC
- "\xhh" : 16進位制數值對應字元,如\x1B表示ESC
- "\x{hhhh}" : 16進位制long型數值對應字元,如\x{263a}表示unicode SMILEY
- "\cK" : K可以為任意字母,表示控制字元"control-K","\cK"表示如VT
- "\N{name}" : unicode命名字元
- "\N{U+hhhh}" : unicode字元
- '\l' : 小寫下一字元
- '\u' : 大寫下一字元
- '\L' : 小寫隨後字串直至'\E'
- '\U' : 大寫隨後字串直至'\E'
- '\E' : 結束大小寫轉換
- '\Q' : 引用隨後字元(禁止轉義)直至'\E'
字元類及其他轉義字元
- '\w' : 匹任任一單詞(word)字元(26個英文字母、10個數字,加下劃線'_'),等同於字符集[A-Za-z0-9_]
- '\W' : 匹配任一非單詞字母
- '\s' : 任一空白字元(空格' ', 製表符'\t'等)
- '\S' : 任一非空白字元
- '\d' : 任一數字字元[0-9]
- '\D' : 任一非數字字元
- “\pP” : 匹配命名屬性P
- "\PP" : 匹配非P
- '\X' : 匹配unicode擴充套件字符集(eXtended grapheme cluster)
- '\C' : 匹配單個C字元(位元組),即使工作在unicode模式下
- '\n' : n為數字,後向引用指定組n
- "\gn" : 後向引用指定組n
- "\g{-n}" : 表示相對(當前位置之前的)第n個後用引用組n
- "\g{name}" : 後向引用命名組(name)。例如“(/(.)\g{1}ll)”可以匹配aall這樣的字串,aa為連續相同的兩個字元
- "\k{name}" : 後向引用
- '\K' : 使\K左側部分,不引入到$&中
- '\N' : 除'\n'外的任一字元
- '\v' : 垂直空白符
- '\V' : 非垂直空白符
- '\h' : 水平空白符
- '\H' : 非水平空白符
- '\R' : 行分割符號
POSIX字元類
POSIX字元類表示語法:[:class:],
在pattern中則必須寫為"[[:class:]]"。
- "[[:alpha:]]" : (英文)字母
- "[[:alnum:]]" : 字母或數字字元
- "[[:ascii:]]" : ASCII字符集中字元
- "[[:blank:]]" : GNU擴充套件,等價於空格' '或水平製表符'\t'
- "[[:cntrl:]]" : 任一控制字元
- "[[:digit:]]" : 任一數字字元,等價於'\d'
- "[[:graph:]]" : 除空格外的任一可列印字元
- "[[:lower:]]" : 任一小寫字元
- "[[:print:]]" : 任一可列印字元,包括空格
- "[[:punct:]]" : 除單詞字元(字母,'_')外的任一圖形字元
- "[[:space:]]" : 任一空白字元,等價於'\s'垂直製表符"\cK"
- "[[:upper:]]" : 任一大寫字元
- "[[:word:]]" : Perl擴充套件, 等價於'\w'
- "[[:xdigit:]]" : 任一16進位制數字
Perl中,"[[^:class:]]"表示posix指定類的補集,這種情況下也可略去[::],在類名前加'^'表示為"[^class]"。
- '\b' : 單詞邊界。例如整單詞搜尋模式“/\bFred\b/”,可以匹配Fred或fred
- '\B' : 非單詞邊界
- '\A' : 字串首
- '\Z' : 字串尾或尾部換行字元之前
- '\z' : 字串尾
- '\G' : 在上一個匹配處進行匹配