1. 正則表達式概述
正則表達式(Regular Expression,簡稱 Regex)是一種用于匹配字符串的模式工具。在 Java 中,正則表達式通過 java.util.regex
包實現,主要涉及以下兩個類:
Pattern
:表示一個編譯好的正則表達式模式。Matcher
:用于在字符串中查找與模式匹配的內容。
正則表達式可以用來驗證格式、提取信息或替換文本,例如檢查郵箱地址是否合法、提取字符串中的數字、按規則分割字符串等。
2. 正則表達式符號速查表
以下是正則表達式的常用符號和元字符(以正則表達式的原始形式列出)。在 Java 代碼中,符號如 \d
需要寫成 \\d
,因為 Java 字符串需要轉義反斜杠。
2.1 基本字符和元字符
符號 | 含義 | 示例 | 不匹配示例 |
---|---|---|---|
\d | 匹配一個數字(0-9) | 5 | a |
\D | 匹配一個非數字 | a | 5 |
\w | 匹配字母、數字或下劃線 | a 、3 或 _ | ! |
\W | 匹配非字母、數字或下劃線 | ! 或 @ | a |
\s | 匹配一個空白字符(如空格、制表符、換行符) | 或 \n | a |
\S | 匹配一個非空白字符 | a 或 1 | 空白字符 |
. | 匹配任意字符(除換行符外) | a 或 1 或 . | \n |
2.2 字符集合
字符集合用方括號 []
表示,用于匹配單個字符。以下是詳細說明:
符號 | 含義 | 示例 | 不匹配示例 |
---|---|---|---|
[abc] | 匹配單個字符,且該字符是 a 、b 或 c | a 、b 或 c | ab (多字符)、d |
[^abc] | 匹配單個字符,且該字符不是 a 、b 或 c | d 或 1 | a 、b 或 c |
[a-z] | 匹配單個小寫字母(a 到 z) | b | A 、1 |
[A-Z] | 匹配單個大寫字母(A 到 Z) | B | a 、1 |
[a-zA-Z] | 匹配單個字母(大小寫均可) | A 或 b | 1 |
[0-9] | 匹配單個數字(0 到 9) | 5 | a |
[a-z&[def]] | 匹配單個字符,且該字符是 a 到 z 中且是 d 、e 或 f | d 、e 或 f | a 、b |
[a-z&&[^bc]] | 匹配單個字符,且該字符是 a 到 z 但不是 b 或 c | a 或 d | b 、c |
[a-z&&[^m-p]] | 匹配單個字符,且該字符是 a 到 z 但不是 m 到 p | a 或 q | m 、n |
說明:[abc]
只匹配單個字符,不會匹配連續的字符串。例如:
- 字符串
ab
:[abc]
會匹配a
(第一個字符),再匹配b
(第二個字符),但不能直接匹配整個ab
。 - 如果要匹配
ab
,需要寫成ab
(連續字符模式),而不是[ab]
。
2.3 量詞
量詞用于指定匹配的次數:
符號 | 含義 | 示例 | 不匹配示例 |
---|---|---|---|
+ | 匹配 1 次或多次 | \d+ 匹配 123 | 空字符串 |
* | 匹配 0 次或多次 | \d* 匹配 12 或空 | 無 |
? | 匹配 0 次或 1 次 | \d? 匹配 1 或空 | 12 (多于 1 個) |
{n} | 匹配正好 n 次 | \d{2} 匹配 12 | 1 、123 |
{n,} | 匹配至少 n 次 | \d{2,} 匹配 123 | 1 |
{n,m} | 匹配 n 到 m 次 | \d{2,3} 匹配 12 或 123 | 1 、1234 |
2.4 邊界匹配
符號 | 含義 | 示例 | 不匹配示例 |
---|---|---|---|
^ | 匹配字符串的開頭 | ^a 匹配 abc 的開頭 | bac |
$ | 匹配字符串的結尾 | a$ 匹配 cba 的結尾 | abc |
\b | 匹配單詞邊界 | \bword\b 匹配單獨的 word | keyword |
3. 使用方法
Java 提供了兩種主要方式來使用正則表達式:通過 Pattern
和 Matcher
類,或者直接使用 String
類的方法。
3.1 使用 Pattern
和 Matcher
步驟:
- 使用
Pattern.compile()
創建正則表達式模式(注意轉義)。 - 使用
Pattern.matcher()
創建一個匹配器。 - 使用
Matcher.find()
和Matcher.group()
查找并獲取匹配結果。
示例代碼:提取字符串中的所有數字,并展示字符集合的匹配。
import java.util.regex.Pattern;
import java.util.regex.Matcher;public class RegexDemo {public static void main(String[] args) {// 示例 1:提取數字String input = "Order: 123, Price: 456";Pattern pattern = Pattern.compile("\\d+"); // 正則表達式 \d+(匹配 1 個或多個數字)Matcher matcher = pattern.matcher(input);System.out.println("提取的數字:");while (matcher.find()) {System.out.println(matcher.group());}// 示例 2:字符集合 [abc] 的匹配String text = "ab";Pattern pattern2 = Pattern.compile("[abc]"); // 正則表達式 [abc](匹配單個 a、b 或 c)Matcher matcher2 = pattern2.matcher(text);System.out.println("\n字符集合 [abc] 匹配結果:");while (matcher2.find()) {System.out.println("匹配到的字符:" + matcher2.group());}}
}
運行結果:
提取的數字:
123
456字符集合 [abc] 匹配結果:
匹配到的字符:a
匹配到的字符:b
說明:在字符串 ab
中,[abc]
每次只匹配一個字符,先匹配到 a
,再匹配到 b
,但它不會將 ab
作為一個整體匹配。
3.2 使用 String
類的方法
String
類提供了幾種簡便的方法:
matches()
:判斷整個字符串是否完全匹配正則表達式。String text = "12345"; boolean isNumber = text.matches("\\d+"); // 返回 true System.out.println("是否全為數字:" + isNumber);
replaceAll()
:替換所有匹配正則表達式的部分。String text = "abc123def456"; String result = text.replaceAll("\\d+", "-"); // 結果:abc-def- System.out.println("替換數字后的結果:" + result);
split()
:按正則表達式分割字符串。String text = "a,b,c"; String[] parts = text.split(","); // 結果:["a", "b", "c"] System.out.println("分割結果:" + java.util.Arrays.toString(parts));
4. 應用實例
4.1 驗證郵箱地址
public class EmailValidation {public static void main(String[] args) {String email = "user@example.com";String emailPattern = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";if (email.matches(emailPattern)) {System.out.println("郵箱格式正確:" + email);} else {System.out.println("郵箱格式錯誤:" + email);}}
}
運行結果:
郵箱格式正確:user@example.com
4.2 驗證手機號碼
public class PhoneValidation {public static void main(String[] args) {String phone = "13812345678";String phonePattern = "^1[3-9]\\d{9}$";if (phone.matches(phonePattern)) {System.out.println("手機號碼格式正確:" + phone);} else {System.out.println("手機號碼格式錯誤:" + phone);}}
}
運行結果:
手機號碼格式正確:13812345678
4.3 提取單詞
public class WordExtraction {public static void main(String[] args) {String input = "Hello world, this is a test";Pattern pattern = Pattern.compile("\\b\\w+\\b"); // 正則表達式 \b\w+\b(匹配單詞)Matcher matcher = pattern.matcher(input);while (matcher.find()) {System.out.println("找到的單詞:" + matcher.group());}}
}
運行結果:
找到的單詞:Hello
找到的單詞:world
找到的單詞:this
找到的單詞:is
找到的單詞:a
找到的單詞:test
4.4 驗證連續字符
如果需要匹配連續的字符(如 ab
),不能使用 [ab]
,而是直接寫成 ab
:
public class SequenceMatch {public static void main(String[] args) {String input = "cabd";Pattern pattern = Pattern.compile("ab"); // 正則表達式 ab(匹配連續的 ab)Matcher matcher = pattern.matcher(input);while (matcher.find()) {System.out.println("找到的連續字符:" + matcher.group());}}
}
運行結果:
找到的連續字符:ab
5. 注意事項
- 性能優化:避免在循環中重復調用
Pattern.compile()
,建議將Pattern
對象定義為靜態變量。 - 轉義規則:正則表達式中的特殊字符(如
.
、+
)需要轉義,在 Java 中需要雙重轉義,例如正則表達式\.
要寫成\\.
。