正規表達式(Regular Expression)

正規表達式(Regular Expression,程式碼常簡寫為regex),使用單個字串來描述、匹配符合規則的字串,通常被用來檢索、取代符合某個模式的文字,主要由表達式、量詞、斷言三部分組成。


表達式是各種字符或字符集:

  • 最簡單的表達式為一個字符,像a或0。
  • 如果是一組字符可使用方括號,像[abc]會匹配一個a或b或c,和[a-c]兩者意思相等。
  • ^表示相反意思,像[^abc]表示匹配任何字符,除了a或b或c。

以下列較常用的字符或字符集:

元素 含意
c字符本身,例如a匹配a
\d匹配一個數字
\D匹配一個非數字
\s匹配一個空白字符,像’\t’、’\n’、’\v’、 ’\f’、’ ’
\S匹配一個非空白字符
\w匹配一個任意字母、數字、下畫線,像a-z、A-Z、0-9、_,任意一個
\W匹配任意一個非單詞字符


量詞表示匹配的表達式出現次數:

  • 默認為{1,1},表示匹配剛好一個。
  • a{1,2}表示匹配字符a,至少要一個,最多兩個。

以下列出常用的量詞:

量詞含意
E?匹配0次或1次,等同於E{0,1}
E+匹配1次或多次,等同於E{1,}
E*匹配0次或多次,等同於E{0,}
E{n}匹配n次,等同於E{n,n}
E{n,}匹配至少n次
E{,m}匹配至多m次,等同於E{0,m}
E{n,m}匹配至少n次,至多m次


斷言表示匹配的前後位置,以下列出常用的斷言:

斷言 含意
^表示字串的開始
$表示字串的結束
\b表示匹配一個位置,也就是一個空格或新行
\B表示匹配一個字符,和\b相反
(?=E)表達式後緊跟著E才匹配
(?! E)表達式後沒有緊跟著E才匹配


假設我們想要匹配0~99之間的整數,可以寫成[0-9]{1,2},如果想匹配的是整個字符串,就須加上^和$,所以想匹配0~99的表達式為^[0-9]{1,2}$,可用\d來代替[0-9],用?代替{0,1},所以也可以寫成^\d{1,2}$或^\d\d{0,1}$或^\d\d?$。


假如我們想匹配"key"或"test",但不是某些字串的子自串,像"turkey",表達式裡 | 表示或的意思,\b斷言表示單詞的邊界是個非單詞字符,如一個空格或新行,所以想匹配"key"或"test"的表達式為\b(key|test)\b。


C++中"\d"是轉義字符,所以表達式裡要用時,要將"\d"寫成"\d"。