核心代碼範例
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
String input = "This order was placed for QT3000! OK?";
String regex = "\\d+"; // 匹配一個或多個連續數字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("找到數字: " + matcher.group()); // 輸出: 3000
} else {
System.out.println("未找到數字");
}
}
}
關鍵 API 解析
| 類/方法 | 說明 |
Pattern.compile(String) | 編譯正則為不可變 Pattern 物件,執行緒安全,可複用。 |
pattern.matcher(CharSequence) | 建立 Matcher,綁定輸入字串,執行緒不安全,勿共用。 |
matcher.find() | 尋找下一個匹配的子序列,返回 boolean。 |
matcher.group() | 返回上一次匹配的完整字串。 |
matcher.group(int) | 返回指定捕獲組內容(組 0 為整體)。 |
matcher.start()/end() | 返回匹配區間在輸入字串中的起止索引。 |
matcher.replaceAll(String) | 替換所有匹配為指定字串。 |
常用正則元字元速查表
| 元字元 | 說明 | 範例 |
^ | 行首 | ^Hello |
$ | 行尾 | World$ |
. | 任意單字元(除換行) | a.c 匹配 abc, axc |
[abc] | 字元集合:a 或 b 或 c | [aeiou] 元音 |
[^abc] | 排除字元集合 | [^0-9] 非數字 |
\d | 數字 [0-9] | \d{4} 4位數字 |
\D | 非數字 [^0-9] | |
\w | 單字字元 [a-zA-Z0-9_] | |
\W | 非單字字元 | |
\s | 空白 [\t\n\r\f] | |
\S | 非空白 | |
* | 0 次或多次 | \d* |
+ | 1 次或多次 | \d+ |
? | 0 次或 1 次 | \d? |
{n} | 恰好 n 次 | \d{3} |
{n,} | 至少 n 次 | \d{2,} |
{n,m} | n 到 m 次 | \d{3,5} |
(...) | 捕獲組 | (\d{4})-(\d{2}) |
(?:...) | 非捕獲組 | (?:\d{3})?\d{4} |
a|b | 或 | cat|dog |
\b | 單字邊界 | \bcat\b |
\B | 非單字邊界 | |
進階實戰範例
1. 提取所有數字(含負號、小數點)
String regex = "-?\\d+(\\.\\d+)?"; // -123, 45.67, 0.5
Matcher m = Pattern.compile(regex).matcher("Temp: -5.5, 100, 3.14");
while (m.find()) System.out.println(m.group());
2. 手機號驗證(中國大陸)
String regex = "^1[3-9]\\d{9}$";
3. 分組替換:隱藏身分證中間 8 位
String id = "110101199003071234";
String masked = id.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
// 結果: 110101********1234
效能建議
- 預編譯 Pattern:靜態常量或單例複用,避免重複編譯。
- 避免過度回溯:慎用
.*、.+,改用具體字元類或佔有優先量詞 .*?。
- 大量資料用
Matcher.usePattern() 切換 Pattern,減少物件創建。