正則表達式是文字處理的瑞士刀,一行模式解決複雜驗證、提取、替換問題。本文精選前端/後端開發最高頻的 20 個實戰範例,附帶語法速查表與調試工具推薦。
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
解析:(?=...) 為正向前瞻斷言,不消耗字符,僅檢查條件。
^[\u4e00-\u9fa5]{0,}$
涵蓋 CJK 統一表意文字基本區。擴展區請用 \u3400-\u4DBF 等。
^\w+$
等價 [a-zA-Z0-9_]+,Java 中 \w 預設僅 ASCII,Unicode 模式需 Pattern.UNICODE_CHARACTER_CLASS。
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$
注意:僅格式校驗,真實有效性需查詢公安庫或校驗碼演算法。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
^[0-9]+(\.[0-9]{2})?$
^(13[0-9]|14[57]|15[0-35-9]|18[0-9]|17[0-8]|19[13589])\d{8}$
號段頻繁更新,生產環境建議維護號段白名單配置而非硬編碼正則。
^.*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
if (!s.match(/^[a-zA-Z]+:\/\//)) { s = 'https://' + s; }
^(f|ht){1}(tp|tps):\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?
^([a-zA-Z]:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
\< *img[^\>]*src *\= *[\"\']{0,1}([^\"\'\ >]*)
(\]*)(href="https?:\/\/)(?!...)[^"]+"((?!.*\brel=)[^\>]*)(?:[^\>]*)\>
^\s*[a-zA-Z\-]+\s*[:]{1}\s[a-zA-Z0-9\s.#]+[;]{1}
<!--(.*?)-->
需啟用 DOTALL / s 模式跨行匹配。
\<\/?\w+((\s+\w+(\s*\=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?\>
| 元字符 | 說明 | 範例 |
|---|---|---|
. | 任意字符 (除換行,DOTALL 含換行) | a.c 匹配 abc, aXc |
\d \D | 數字 / 非數字 | \d{3} 三位數 |
\w \W | 單字字符 / 非單字 | \w+ 變量名 |
\s \S | 空白 / 非空白 | \s* 任意空白 |
[abc] | 字符集合 | [aeiou] 元音 |
[^abc] | 排除字符集 | [^0-9] 非數字 |
* + ? | 0或多 / 1或多 / 0或1 | \d+ 至少一位數 |
{n,m} | n 到 m 次 | \d{3,5} 3-5位數 |
^ $ | 行首 / 行尾 (多行模式) | ^start |
\b \B | 單字邊界 / 非邊界 | \bcat\b 整詞 cat |
(...) | 捕獲組 | (\d{4})-(\d{2}) |
(?:...) | 非捕獲組 | (?:\d{3})? |
(?=...) | 正向前瞻 | (?=.*\d) 含數字 |
(?!...) | 負向前瞻 | (?!.*\s) 無空白 |
(?<=...) | 正向後瞻 | (?<=\$)\d+ $ 後數字 |
(?<!...) | 負向後瞻 | (?<!\d)\d{3}(?!\d) 獨立3位數 |
\1 \2 | 反向引用 | (['\"]).*?\1 配對引號 |
i / CASE_INSENSITIVE:忽略大小寫m / MULTILINE:^$ 匹配行首尾s / DOTALL:. 匹配換行x / COMMENTS:忽略模式空白,支援註釋u / UNICODE_CHARACTER_CLASS:Unicode 感知 (Java 關鍵)// 1. 複用 Pattern (編譯昂貴,線程安全)
private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX);
// 2. 使用 Matcher 進行匹配/提取/替換
Matcher m = EMAIL_PATTERN.matcher(input);
if (m.matches()) { ... } // 整串匹配
while (m.find()) { // 尋找所有子串
System.out.println(m.group(1)); // 獲取第 1 組
}
// 3. 替換
String masked = EMAIL_PATTERN.matcher(email).replaceAll("***@***.com");
// 4. 分割 (String.split 內部用 Pattern)
String[] parts = input.split("\\s*,\\s*"); // 逗號分割,忽略空白
.* 貪婪匹配盡可能多,.*? 惰性匹配盡可能少 (HTML 解析必用惰性)。(a+)+b 匹配 aaaaac 導致指數級回溯,改用佔有優先量詞 (a++)+b 或原子組 (?>a+)+b。\\d、\\\\,建議用文本塊 (Java 15+) """\\d+"""。