正則表達式是一門「模式描述語言」,擁有完整的語法體系與運算符優先級。本文提供 PCRE (PHP/JS/Java 通用) 完整元字符速查表、運算符優先級表、常用模式模板,作為開發時的桌面參考手冊。
完整元字符速查表
| 字符 | 說明 | 示例 |
\ | 轉義符,標記下一字符為特殊/字面/後向引用/八進制 | \n 換行,\\ 反斜杠,\( 左括號 |
^ | 字符串/行 首 (多行模式) | ^abc |
$ | 字符串/行 尾 (多行模式) | abc$ |
* | 前面子表達式 0~∞ 次 | zo* 匹配 z, zo, zoo |
+ | 前面子表達式 1~∞ 次 | zo+ 匹配 zo, zoo |
? | 前面子表達式 0~1 次 | do(es)? 匹配 do, does |
{n} | 固定 n 次 | o{2} 匹配 food 中的 oo |
{n,} | 至少 n 次 | o{2,} 匹配 foooood 所有 o |
{n,m} | n 到 m 次 | o{1,3} 匹配前 3 個 o |
? (量詞後) | 惰性/非貪婪模式 | o+? 匹配單個 o |
. | 除換行外任意字符 (s 修飾符含換行) | a.c 匹配 aac, abc, a-c |
(pattern) | 捕獲分組,可後向引用 | (abc)\1 匹配 abcabc |
(?:pattern) | 非捕獲分組 | industr(?:y|ies) |
(?=pattern) | 正向前瞻 (零寬斷言) | Windows(?=95|98) |
(?!pattern) | 負向前瞻 | Windows(?!95|98) |
(?<=pattern) | 正向後顧 (固定寬度) | (?<=\$)\d+ |
(?<!pattern) | 負向後顧 | (?<!\$)\d+ |
x|y | 選擇分支 | cat|dog |
[xyz] | 字符集合 | [abc] 匹配 a |
[^xyz] | 否定字符集合 | [^abc] 匹配 p |
[a-z] | 字符範圍 | [a-z] 小寫字母 |
[^a-z] | 否定字符範圍 | [^a-z] 非小寫 |
\b | 單詞邊界 | er\b 匹配 never 中的 er |
\B | 非單詞邊界 | er\B 匹配 verb 中的 er |
\cx | 控制字符 | \cM 回車 |
\d | 數字 [0-9] | - |
\D | 非數字 [^0-9] | - |
\f | 換頁 | - |
\n | 換行 | - |
\r | 回車 | - |
\s | 空白 [\f\n\r\t\v] | - |
\S | 非空白 [^\f\n\r\t\v] | - |
\t | 製表 | - |
\v | 垂直製表 | - |
\w | 單詞字符 [A-Za-z0-9_] | - |
\W | 非單詞字符 [^A-Za-z0-9_] | - |
\xHH | 十六進制 (2位) | \x41 = A |
\num | 後向引用 (捕獲組編號) | (.)\1 連續相同字符 |
\n (八進制) | 八進制轉義/後向引用 (視上下文) | \11 = Tab |
\nm | 八進制/後向引用 | - |
\nml | 八進制 (n=0-3, m,l=0-7) | \011 = Tab |
\uHHHH | Unicode 字符 (4位十六進制) | \u00A9 = © |
運算符優先級 (高 → 低)
| 優先級 | 運算符 | 結合性 | 說明 |
| 1 (最高) | \ | 右 | 轉義符 |
| 2 | () (?:) (?=) (?!) [] | 左 | 分組、斷言、字符類別 |
| 3 | * + ? {n} {n,} {n,m} | 左 | 限定符 (量詞) |
| 4 | ^ $ \元字符 | 左 | 定位符、序列 |
| 5 (最低) | | | 左 | 選擇分支 (或) |
優先級實例解析
# 1. 量詞 > 選擇
ab*|cd # 等價於 (ab*)|(cd) 而非 a(b*|c)d
# 2. 分組改變優先級
a(b|c)* # a 後跟 0 或多個 b 或 c
(a|b)c* # a 或 b,後跟 0 或多個 c
# 3. 定位符範圍
^abc$ # 整行匹配 abc
^abc|def$ # (^abc) | (def$) 首行 abc 或 尾行 def
^(abc|def)$ # 整行匹配 abc 或 def
常用模式模板庫
<?php
$patterns = [
// 基礎驗證
'non_empty' => '/\S/',
'whitespace' => '/^\s*$/',
'alphanumeric' => '/^[A-Za-z0-9]+$/',
'alpha_space' => '/^[A-Za-z\s]+$/',
// 數字格式
'integer' => '/^[+-]?\d+$/',
'float' => '/^[+-]?\d*\.?\d+$/',
'price' => '/^\d+(\.\d{1,2})?$/',
'percentage' => '/^\d+(\.\d+)?%?$/',
// 日期時間 (格式驗證,不驗證邏輯有效性)
'date_ymd' => '/^\d{4}-\d{2}-\d{2}$/',
'datetime' => '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/',
'time_hms' => '/^\d{2}:\d{2}:\d{2}$/',
// 網絡
'ipv4' => '/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/',
'mac' => '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/',
'domain' => '/^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/',
'url' => '/^https?:\/\/(?:[^\s\/$.?#].[^\s]*)/i',
// 身份證明
'email' => '/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/',
'id_card_cn' => '/^[1-9]\d{5}(?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/',
'mobile_cn' => '/^1[3-9]\d{9}$/',
'plate_cn' => '/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}$/',
// 編程相關
'variable' => '/^[A-Za-z_][A-Za-z0-9_]*$/',
'hex_color' => '/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/',
'uuid' => '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i',
'json_brace' => '/^\s*[\{\[].*[\}\]]\s*$/s',
// 安全檢測
'sql_injection' => '/(union|select|insert|update|delete|drop|alter|create)\s+/i',
'xss_script' => '/<script\b[^>]*>.*?<\/script>/is',
'path_traversal' => '/\.\.[\/\\\\]/',
];
// 使用示例
function check($name, $input) {
global $patterns;
$ok = (bool)preg_match($patterns[$name], $input);
echo "[$name] '$input' => " . ($ok ? '✓' : '✗') . "\n";
}
check('email', 'test@example.com');
check('mobile_cn', '13800138000');
check('id_card_cn', '11010119900307123X');
check('uuid', '550e8400-e29b-41d4-a716-446655440000');
check('hex_color', '#ff0000');
check('path_traversal', '../../etc/passwd');
修飾符 (Flags) 速查
| 修飾符 | 名稱 | 效果 | PHP 常量 |
i | 忽略大小寫 | 大小寫不敏感匹配 | PCRE_CASELESS |
m | 多行模式 | ^ $ 匹配行首尾 | PCRE_MULTILINE |
s | 單行模式 (DOTALL) | . 匹配含換行 | PCRE_DOTALL |
x | 擴展模式 | 忽略模式空白、允許註釋 # | PCRE_EXTENDED |
u | UTF-8 模式 | 正確處理 Unicode,支援 \p{} | PCRE_UTF8 |
U | 非貪婪模式 | 反轉量詞貪婪性 | PCRE_UNGREEDY |
A | 強制錨定 | 強制從字符串開頭匹配 | PCRE_ANCHORED |
D | 美元優化 | $ 僅匹配字符串絕對結尾 | PCRE_DOLLAR_ENDONLY |
J | 重複命名組 | 允許同名命名捕獲組 | PCRE_DUPNAMES |
總結
正則語法雖繁,但核心在於:轉義 > 分組/斷言/類別 > 量詞 > 定位/序列 > 選擇。熟練掌握優先級、善用分組控制範圍、靈活切換貪婪/惰性、根據場景選擇修飾符,是編寫高性能、可維護模式的關鍵。建議收藏本文作為開發速查手冊。