正則表達式基礎概念
正則表達式是描述文本模式的強大工具,由普通字符(如 a-z)與特殊元字符組成。模式描述搜尋文本時要匹配的一個或多個字串。Java 透過 java.util.regex 套件提供完整支援。
常見範例速查
| 表達式 | 匹配說明 |
^\s*$ | 匹配空行 |
\d{2}-\d{5} | 驗證兩位數字-連字號-五位數字的 ID 格式 |
<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*/\1\s*> | 匹配 HTML 標籤(含屬性與巢狀內容) |
元字符完整對照表
字符轉義與邊界
\:轉義下一字符,標記特殊字符、反向引用或八進制轉義。
^:匹配輸入字串開頭;多行模式下匹配 \n 或 \r 後位置。
$:匹配輸入字串結尾;多行模式下匹配 \n 或 \r 前位置。
\b:單字邊界(字與空格間位置)。
\B:非單字邊界。
量詞(貪婪/非貪婪)
| 量詞 | 說明 | 等效寫法 |
* | 零次或多次 | {0,} |
+ | 一次或多次 | {1,} |
? | 零次或一次 | {0,1} |
{n} | 正好 n 次 | — |
{n,} | 至少 n 次 | — |
{n,m} | 至少 n 次,至多 m 次 | — |
在量詞後加 ? 切換為非貪婪模式(如 +?、*?),匹配最短字串。
字符類與預定義字符類
.:匹配除 \n 外任意字符(含 \n 用 [\s\S])。
[xyz]:字符集,匹配任一字符。
[^xyz]:反向字符集。
[a-z]:字符範圍。
\d:數字 [0-9];\D:非數字。
\s:空白字符(空格、製表、換頁等);\S:非空白。
\w:單字字符(字母、數字、底線);\W:非單字字符。
分組與前瞻
| 語法 | 名稱 | 說明 |
(pattern) | 捕獲組 | 匹配並捕獲,可用 $1~$9 反向引用。 |
(?:pattern) | 非捕獲組 | 匹配不捕獲,用於 | 組合優化(如 industr(?:y|ies))。 |
(?=pattern) | 正向前瞻 | 匹配 pattern 前的位置,不消耗字符(如 Windows(?=95|98|NT))。 |
(?!pattern) | 負向前瞻 | 匹配非 pattern 前的位置(如 Windows(?!95|98|NT))。 |
其他特殊構造
x|y:或運算,匹配 x 或 y。
\cx:控制字符(如 \cM 回車)。
\xnn:十六進制轉義(兩位)。
\unnnn:Unicode 字符(四位十六進制)。
\n、\nm、\nml:八進制轉義或反向引用(視上下文)。
Java 程式碼實戰範例
import java.util.regex.*;
public class RegexDemo {
public static void main(String[] args) {
String text = "Contact: user@example.com, phone: 02-12345678";
// 編譯模式
Pattern emailPattern = Pattern.compile("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b");
Pattern phonePattern = Pattern.compile("\\d{2}-\\d{8}");
// 匹配器操作
Matcher m = emailPattern.matcher(text);
while (m.find()) {
System.out.println("Email: " + m.group());
}
// 替換示例
String masked = phonePattern.matcher(text).replaceAll("XX-XXXXXXXX");
System.out.println("Masked: " + masked);
}
}
最佳實踐建議
- 複雜模式預先編譯
Pattern 物件重用,避免重複編譯開銷。
- 善用非捕獲組
(?:...) 提升效能與簡化群組編號。
- 大量資料處理時,考慮
Matcher.useTransparentBounds 等進階 API。
- 正則雖強,但非萬能:複雜巢狀結構(如完整 HTML/JSON 解析)請用專用解析器。
- 上一篇文章: 繼承與介面的本質區別:從「是一種」到「能做什麼」的設計哲學轉變
- 下一篇文章: Java 基礎核心:int 與 Integer 的本質區別、自動裝箱/拆箱與效能考量
Copyright ©
程式碼之家 All Rights Reserved