正則表達式基礎概念
正則表達式 是一種文本模式描述語言,用於匹配、搜索、替換、驗證字符串。廣泛應用於編程語言、編輯器、Shell 工具、數據庫查詢中。
核心元字符速查
| 符號 | 名稱 | 含義 | 示例匹配 |
. | 點號 | 任意單字符(除換行) | c.t → cat, cot, czt |
* | 星號 | 前導字符 0 次或多次 | ab*c → ac, abc, abbc |
+ | 加號 | 前導字符 1 次或多次 | ab+c → abc, abbc |
? | 問號 | 前導字符 0 次或 1 次 | ab?c → ac, abc |
{n} | 固定次數 | 恰好 n 次 | a{3} → aaa |
{n,} | 至少 n 次 | n 次或更多 | a{2,} → aa, aaa, ... |
{n,m} | 範圍次數 | n 到 m 次 | a{2,4} → aa, aaa, aaaa |
定位符
| 符號 | 含義 | 示例 |
^ | 字符串開始 | ^hello 匹配 "hello world",不匹配 "say hello" |
$ | 字符串結束 | world$ 匹配 "hello world",不匹配 "world wide" |
\b | 單詞邊界 | \bcat\b 匹配 "cat"、"a cat",不匹配 "category" |
\B | 非單詞邊界 | \Bcat\B 匹配 "scatter" 中的 cat |
字符類與預定義字符類
| 語法 | 含義 | 等價寫法 |
[abc] | a 或 b 或 c | - |
[^abc] | 非 a/b/c | - |
[a-z] | 小寫字母 | - |
[0-9] | 數字 | \d |
\D | 非數字 | [^0-9] |
\w | 單詞字符(字母數字下劃線) | [a-zA-Z0-9_] |
\W | 非單詞字符 | [^a-zA-Z0-9_] |
\s | 空白字符(空格、制表、換行) | [ \t\r\n\f] |
\S | 非空白字符 | [^ \t\r\n\f] |
分組與捕獲
/(php)+/ # 整體分組,匹配 php, phpphp
/(?php|java)/ # 命名捕獲組
/(\d{4})-(\d{2})/ # 兩個捕獲組:年、月
/(?:non-capture)/ # 非捕獲分組(僅分組不捕獲)
或運算與優先級
/cat|dog/ # 匹配 cat 或 dog
/(cat|dog)food/ # 匹配 catfood 或 dogfood
/^cat|dog$/ # 注意:等同於 (^cat) | (dog$) 而非 ^(cat|dog)$
貪婪 vs 非貪婪(懶惰)匹配
<?php
$str = '<div>content</div><span>more</span>';
preg_match('/<.+>/', $str); // 貪婪:匹配整個 "<div>content</div><span>more</span>"
preg_match('/<.+?>/', $str); // 非貪婪:匹配 "<div>"
修飾符
| 修飾符 | 作用 |
i | 忽略大小寫 |
m | 多行模式(^$ 匹配行首尾) |
s | 單行模式(. 匹配換行) |
x | 擴展模式(忽略空白、允許註釋) |
u | UTF-8 模式(正確處理 Unicode) |
實戰練習
- 匹配郵箱:
/^[\w.+-]+@[\w-]+\.[\w.-]+$/
- 匹配身份證(18位):
/^\d{17}[\dXx]$/
- 匹配 IPV4:
/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d)$/
- 去除 HTML 標籤:
preg_replace('/<[^>]+>/', '', $html)
下篇將講解 PHP 中的 PCRE 函數族、JavaScript 與 Perl 的正則差異、進階替換技巧與效能優化。