正則表達式(Regular Expression,Regex)是文本處理的「瑞士軍刀」:語法晦澀,但掌握後能以極少代碼解決複雜的字符串匹配、驗證、提取、替換問題。本系列共 5 篇,本文為第一部分,奠定核心概念基礎。
正則表達式是一種字符模式模板,由普通字符(字面量)和元字符(特殊符號)組成,用於描述字符串匹配規則。核心能力三大類:
區別:Shell 通配符
*.txt中*表示「任意字符」,正則中*表示「前一字符出現 0 次或多次」。兩者語義完全不同,切勿混淆。
字母、數字、漢字、下劃線、大多數標點:字面匹配自身。
/php/ 匹配 "php"、"php教程" 中的 "php"。
| 符號 | 含義 |
|---|---|
\n | 換行符 (LF, ASCII 10) |
\r | 回車符 (CR, ASCII 13) |
\t | 製表符 (Tab, ASCII 9) |
\s | 任意空白字符(空格、\t、\n、\r、\f、\v) |
\S | 任意非空白字符 |
\d | 數字 [0-9] |
\D | 非數字 [^0-9] |
\w | 單詞字符 [a-zA-Z0-9_](含下劃線) |
\W | 非單詞字符 |
| 符號 | 含義 | 需轉義? | |
|---|---|---|---|
. | 匹配除換行符外任意字符 | 在字符類 [] 內不需 | |
^ | 行首錨點(多行模式下為行首) | 在 [] 開頭需轉義 | |
$ | 行尾錨點(多行模式下為行尾) | 在 [] 內不需 | |
| | 或運算(分支) | 是 | |
() | 分組、捕獲、改變優先級 | 是 | |
[] | 字符類(集合) | 是 | |
{} | 量詞精確範圍 | 是 | |
\ | 轉義符 | 是 |
| 符號 | 含義 | 等價寫法 | 貪婪/懶惰 |
|---|---|---|---|
* | 0 次或多次 | {0,} | 貪婪 |
+ | 1 次或多次 | {1,} | 貪婪 |
? | 0 次或 1 次 | {0,1} | 貪婪 |
{n} | 恰好 n 次 | - | 貪婪 |
{n,} | 至少 n 次 | - | 貪婪 |
{n,m} | n 到 m 次 | - | 貪婪 |
*? +? ?? {n,m}? | 懶惰模式(盡可能少匹配) | - | 懶惰 |
^:字符串開始(多行模式 m 時為行首)$:字符串結束(多行模式 m 時為行尾)\b:單詞邊界(\w 與 \W 交界)\B:非單詞邊界\A:絕對字符串開始(不受多行模式影響)\Z:絕對字符串結束(允許末尾 \n)\z:絕對字符串結束(不允許末尾 \n)pattern1|pattern2|pattern3:從左到右嘗試匹配,首個成功即返回。順序影響性能與結果。
\1、\2...\9:引用前面捕獲組匹配的內容。
/(['\"])(.*?)\1/ 匹配單雙引號包裹的字符串(引號必須成對)。
\ 轉義() (?:) (?=) 分組/斷言* + ? {} 量詞^ $ \b 錨點/序列連接| 分支(或)善用括號改變優先級:/ab|c/ 匹配 "ab" 或 "c";/a(b|c)/ 匹配 "ab" 或 "ac"。
<?php
// 初級:簡單但不準
$pattern1 = '/^.+@.+\..+$/';
// 進階:符合 RFC 5322 簡化版(推薦實際項目使用)
$pattern2 = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
// 實戰函數
function isValidEmail($email) {
return (bool)preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email);
}
var_dump(isValidEmail('test@example.com')); // true
var_dump(isValidEmail('invalid')); // false
?>
preg_match、preg_match_all、preg_replace、preg_split、preg_quote(下篇講解)。勸告:正則表達式強大但不可濫用。能用
strpos、explode、json_decode、DOM 解析器解決的,絕不寫正則。正則是「最後手段」,而非「首選工具」。