字元類別 [] 與轉義序列 \ 是正則表達式表達能力的基石。本文深入剖析兩者的語法細節、預定義類別、Unicode 屬性擴展、轉義陷阱與實戰組合模式,助你寫出精準、可讀、高效的正則。
[] 完整語法[abc]:匹配 a、b、c 任一字元。[a-z]:範圍,匹配小寫字母(ASCII 碼連續)。[a-zA-Z0-9_]:等價 \w(ASCII 模式下)。[^abc]:否定類別,匹配非 a/b/c 字元(^ 必須在首位)。[]] 或 []:匹配字面 ](放首位或轉義)。[-abc] 或 [abc-]:匹配字面 -(放首尾或轉義)。[] 內使用)| 類別 | 含義 | ASCII 等價 |
|---|---|---|
[:alpha:] | 字母 | [A-Za-z] |
[:alnum:] | 字母數字 | [A-Za-z0-9] |
[:digit:] | 數字 | [0-9] |
[:space:] | 空白字元(空格、\t \n \r \f \v) | [\s] |
[:upper:] | 大寫字母 | [A-Z] |
[:lower:] | 小寫字母 | [a-z] |
[:punct:] | 標點符號 | [!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~] |
[:xdigit:] | 十六進制數字 | [0-9A-Fa-f] |
[:cntrl:] | 控制字元 | [\x00-\x1F\x7F] |
[:print:] | 可列印字元 | [\x20-\x7E] |
[:graph:] | 可見字元(非空白可列印) | [\x21-\x7E] |
用法:[[:alpha:]_] 匹配字母或下劃線。注意:雙層方括號是語法一部分,非巢狀。
u 修飾符,PCRE 8.10+)\p{L} / \p{Letter}:任意字母(含中文、日文、表情符號字母)。\p{N} / \p{Number}:任意數字(含全形數字、羅馬數字)。\p{P} / \p{Punctuation}:標點。\p{S} / \p{Symbol}:符號(數學、貨幣、箭頭等)。\p{M} / \p{Mark}:修飾符(重音、聲調符)。\p{Z} / \p{Separator}:分隔符(空格、行分隔、段分隔)。\p{C} / \p{Other}:其他(控制、格式、代理、私用、未分配)。\p{Han}(漢字)、\p{Hiragana}(平假名)、\p{Katakana}(片假名)、\p{Arabic}、\p{Latin}。\P{L} = 非字母。範例:/[\p{Han}\p{Katakana}\p{Hiragana}]+/u 匹配連續中日文。
[[a-z]--[aeiou]]:差集,小寫輔音字母。[[a-z]~~[aeiou]]:對稱差集。[[a-z]&&[^aeiou]]:交集(等價前者)。\ 完整圖譜以下字元在正則中有特殊含義,需轉義匹配字面值:
. \ + * ? [ ] ^ $ ( ) { } | / #
例:\. 匹配點號、\[ 匹配左括號、\\ 匹配反斜線。
| 序列 | 字元 | 十六進制 |
|---|---|---|
\t | 製表符 | 0x09 |
\n | 換行 (LF) | 0x0A |
\r | 回車 (CR) | 0x0D |
\f | 換頁 | 0x0C |
\v | 垂直製表 | 0x0B |
\a | 響鈴 | 0x07 |
\e | Escape | 0x1B |
\0nn / \nnn:八進位(最多 3 位,\0 開頭避免與回溯引用衝突)。\xhh:兩位十六進位。\x{hhhh}:任意長度十六進位 Unicode 碼點(需 u 修飾符)。\u{hhhh}:同 \x{}(PHP 7.0+,更直觀)。[] 內外均可用)| 序列 | 含義 | 等價類別 (ASCII) | Unicode (u修飾符) |
|---|---|---|---|
\d | 數字 | [0-9] | \p{Nd} |
\D | 非數字 | [^0-9] | \P{Nd} |
\w | 單詞字元 | [A-Za-z0-9_] | [\p{L}\p{N}\p{Pc}] |
\W | 非單詞字元 | [^A-Za-z0-9_] | [^\p{L}\p{N}\p{Pc}] |
\s | 空白字元 | [\t\n\r\f\v ] | \p{Z}\t\n\r\f\v |
\S | 非空白字元 | [^\t\n\r\f\v ] | [^\p{Z}\t\n\r\f\v] |
\h | 水平空白 | [\t ] | [\p{Zs}\t] |
\H | 非水平空白 | [^\t ] | [^\p{Zs}\t] |
\v | 垂直空白 | [\n\r\f\v] | [\p{Zl}\p{Zp}\n\r\f\v] |
\V | 非垂直空白 | [^\n\r\f\v] | [^\p{Zl}\p{Zp}\n\r\f\v] |
\R | 任意換行序列 | (?>\r\n|\n|\r|\f|\v) | 同左 |
\X | 擴展書寫字素簇 | — | 單一可見字元(含組合字元) |
\b / \B:單詞邊界 / 非邊界(依賴 \w 定義)。\A / \Z / \z:字串絕對開頭/結尾/真實結尾。\G:上次匹配結束位置(配合 preg_match_all 連續匹配)。\K:重置匹配起始位置(丟棄前面匹配內容),極佳替代正向後顧:foo\Kbar 匹配 foobar 中的 bar,整體匹配結果僅 bar。/^[\p{Han}]{2,10}$/u
/^[\p{Han}]{2,5}(?:·[\p{Han}]{2,5})?$/u // 含·號
/https?:\/\/(?:[\p{L}\p{N}-]+\.)+[\p{L}]{2,}(?:\/[\p{L}\p{N}._~!$&'()*+,;=:@%/-]*)?/u
/[\p{Cc}\p{Cf}]+/u // 移除控制、格式字元
/^(?=.*[\p{Ll}])(?=.*[\p{Lu}])(?=.*[\p{Nd}])(?=.*[\p{P}\p{S}]).{8,30}$/u
[\-\^\]abc] 或 [abc\-\^\]]。u 變 Unicode,影響邊界判斷。'\\d' → 正則引擎見 \d;單引號 '\d' → 正則見 d。建議習慣用單引號 + 雙反斜線 '\\d' 或 "/\\d/"。[\R] 視為 R 字面字元。精通字元類別與轉義序列,是編寫「可讀、可維護、無 Bug」正則的前提。建議收藏本表,遇到字元匹配疑問即查即用。