<摘錄>perl正規表示式中的元字元、轉義字元、量詞及匹配方式

木子你妹發表於2014-08-11

  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' : 在上一個匹配處進行匹配

相關文章