在 Java 中,Pattern
?和?Matcher
?類是?java.util.regex
?包的核心,用于處理正則表達式。
Pattern
?類
Pattern
?類表示編譯后的正則表達式,它提供了一種將正則表達式字符串編譯成可執行對象的方式,以便后續用于匹配操作。
常用方法
compile(String regex)
:這是一個靜態方法,用于將給定的正則表達式字符串編譯為?Pattern
?對象。matcher(CharSequence input)
:創建一個?Matcher
?對象,該對象將使用編譯好的正則表達式對指定的輸入字符串進行匹配操作。split(CharSequence input)
:根據正則表達式將輸入的字符串分割成字符串數組。
示例代碼
import java.util.regex.Pattern;public class PatternExample {public static void main(String[] args) {// 編譯正則表達式Pattern pattern = Pattern.compile("\\d+");// 使用 split 方法分割字符串String input = "abc123def456ghi";String[] parts = pattern.split(input);for (String part : parts) {System.out.println(part);}}
}
在上述代碼中,首先使用?Pattern.compile("\\d+")
?編譯了一個匹配一個或多個數字的正則表達式。然后使用?split
?方法將輸入字符串按照數字進行分割,最后打印分割后的結果。
Matcher
?類
Matcher
?類用于對輸入字符串執行匹配操作,它提供了多種方法來查找、替換和提取匹配的子字符串。
常用方法
find()
:嘗試在輸入字符串中查找下一個匹配的子字符串,如果找到則返回?true
,否則返回?false
。matches()
:嘗試將整個輸入字符串與正則表達式進行匹配,如果完全匹配則返回?true
,否則返回?false
。group()
:返回上一次匹配操作所匹配的子字符串。replaceAll(String replacement)
:將輸入字符串中所有匹配的子字符串替換為指定的字符串。
示例代碼
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class MatcherExample {public static void main(String[] args) {// 編譯正則表達式Pattern pattern = Pattern.compile("\\d+");// 創建 Matcher 對象Matcher matcher = pattern.matcher("abc123def456ghi");// 使用 find 方法查找匹配的子字符串while (matcher.find()) {System.out.println("找到匹配項: " + matcher.group());}// 使用 replaceAll 方法替換匹配的子字符串String result = matcher.replaceAll("X");System.out.println("替換后的字符串: " + result);}
}
在上述代碼中,首先編譯了一個匹配一個或多個數字的正則表達式,并創建了一個?Matcher
?對象。然后使用?find
?方法在輸入字符串中查找所有匹配的數字,并打印出來。最后使用?replaceAll
?方法將所有匹配的數字替換為字符?X
,并打印替換后的字符串。
相關網站
- 正則表達式在線測試工具:Regex101,可以在線測試和調試正則表達式,同時支持多種編程語言的語法。
正則表達式
正則表達式是用于匹配、查找和替換文本模式的強大工具,在許多編程語言和文本處理工具中都有廣泛應用。以下是一些常用的正則表達式及其用途:
1. 匹配數字
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class DigitMatching {public static void main(String[] args) {String input = "abc123";// 匹配單個數字Pattern singleDigitPattern = Pattern.compile("\\d");Matcher singleDigitMatcher = singleDigitPattern.matcher(input);while (singleDigitMatcher.find()) {System.out.println("單個數字匹配結果: " + singleDigitMatcher.group());}// 匹配多個數字Pattern multipleDigitPattern = Pattern.compile("\\d+");Matcher multipleDigitMatcher = multipleDigitPattern.matcher(input);while (multipleDigitMatcher.find()) {System.out.println("多個數字匹配結果: " + multipleDigitMatcher.group());}}
}
2. 匹配字母
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class LetterMatching {public static void main(String[] args) {String input = "ABCabc";// 匹配單個小寫字母Pattern lowerCasePattern = Pattern.compile("[a-z]");Matcher lowerCaseMatcher = lowerCasePattern.matcher(input);while (lowerCaseMatcher.find()) {System.out.println("單個小寫字母匹配結果: " + lowerCaseMatcher.group());}// 匹配單個大寫字母Pattern upperCasePattern = Pattern.compile("[A-Z]");Matcher upperCaseMatcher = upperCasePattern.matcher(input);while (upperTypeCaseMatcher.find()) {System.out.println("單個大寫字母匹配結果: " + upperCaseMatcher.group());}// 匹配單個字母(不區分大小寫)Pattern anyCasePattern = Pattern.compile("[a-zA-Z]");Matcher anyCaseMatcher = anyCasePattern.matcher(input);while (anyCaseMatcher.find()) {System.out.println("單個字母(不區分大小寫)匹配結果: " + anyCaseMatcher.group());}}
}
3. 匹配字母和數字
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class AlphanumericMatching {public static void main(String[] args) {String input = "abc123@#$";// 匹配單個字母或數字Pattern singleAlphanumericPattern = Pattern.compile("[a-zA-Z0-9]");Matcher singleAlphanumericMatcher = singleAlphanumericPattern.matcher(input);while (singleAlphanumericMatcher.find()) {System.out.println("單個字母或數字匹配結果: " + singleAlphanumericMatcher.group());}// 匹配多個字母或數字Pattern multipleAlphanumericPattern = Pattern.compile("[a-zA-Z0-9]+");Matcher multipleAlphanumericMatcher = multipleAlphanumericPattern.matcher(input);while (multipleAlphanumericMatcher.find()) {System.out.println("多個字母或數字匹配結果: " + multipleAlphanumericMatcher.group());}}
}
4. 匹配空白字符
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class WhitespaceMatching {public static void main(String[] args) {String input = "abc 123";// 匹配單個空白字符Pattern singleWhitespacePattern = Pattern.compile("\\s");Matcher singleWhitespaceMatcher = singleWhitespacePattern.matcher(input);while (singleWhitespaceMatcher.find()) {System.out.println("單個空白字符匹配結果: " + singleWhitespaceMatcher.group());}// 匹配多個空白字符Pattern multipleWhitespacePattern = Pattern.compile("\\s+");Matcher multipleWhitespaceMatcher = multipleWhitespacePattern.matcher(input);while (multipleWhitespaceMatcher.find()) {System.out.println("多個空白字符匹配結果: " + multipleWhitespaceMatcher.group());}}
}
5. 匹配郵箱地址
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class EmailMatching {public static void main(String[] args) {String email = "test@example.com";String patternStr = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";Pattern pattern = Pattern.compile(patternStr);Matcher matcher = pattern.matcher(email);if (matcher.matches()) {System.out.println("有效郵箱地址");} else {System.out.println("無效郵箱地址");}}
}
6. 匹配手機號碼
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PhoneNumberMatching {public static void main(String[] args) {String phone = "13800138000";String patternStr = "^1[3-9]\\d{9}$";Pattern pattern = Pattern.compile(patternStr);Matcher matcher = pattern.matcher(phone);if (matcher.matches()) {System.out.println("有效手機號碼");} else {System.out.println("無效手機號碼");}}
}
關于匹配郵箱詳解:
"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";符號的含義
1. 定界符
^
:表示匹配字符串的開始位置。在該正則表達式中,它確保匹配是從字符串的起始處開始的,即郵箱地址的起始部分必須符合后續的規則。$
:表示匹配字符串的結束位置。意味著整個字符串必須完全匹配正則表達式所定義的模式,直到字符串結束。結合?^
?和?$
?使用,能保證整個字符串是一個完整的郵箱地址,而不是包含在其他文本中的部分郵箱地址。
2. 用戶名部分:[a-zA-Z0-9._%+-]+
[a-zA-Z0-9._%+-]
:這是一個字符類,它定義了一組允許的字符。a-zA-Z
:表示所有的大小寫英文字母,即?A
?到?Z
?和?a
?到?z
。0-9
:表示所有的數字,即?0
?到?9
。.
、_
、%
、+
、-
:這些是特定的符號,在郵箱用戶名中是允許出現的。
+
:是一個量詞,表示前面的字符類(即?[a-zA-Z0-9._%+-]
)必須出現一次或多次。也就是說,郵箱用戶名至少要有一個字符,并且只能由上述定義的字符組成。
3.?@
:
這是郵箱地址中用于分隔用戶名和域名的固定符號,在正則表達式中直接使用該字符來匹配實際郵箱地址中的?@
?符號。
4. 域名部分:[a-zA-Z0-9.-]+
[a-zA-Z0-9.-]
:同樣是一個字符類,允許的字符包括大小寫英文字母、數字、點號?.
?和連字符?-
。在域名中,這些字符是常見的組成部分。+
:表示前面的字符類必須出現一次或多次,即域名部分至少要有一個字符,且由上述定義的字符組成。
5.?\\.
:
- 點號?
.
?在正則表達式中有特殊含義,表示匹配任意單個字符。為了匹配實際的點號(即郵箱地址中的域名分隔符),需要使用反斜杠?\
?進行轉義。由于在 Java 字符串中,反斜杠本身也需要轉義,所以寫成?\\.
。
6. 頂級域名部分:[a-zA-Z]{2,}
[a-zA-Z]
:表示所有的大小寫英文字母。{2,}
:是一個量詞,表示前面的字符類(即?[a-zA-Z]
)必須出現至少 2 次。這是因為常見的頂級域名(如?.com
、.org
、.cn
?等)通常至少由兩個字母組成。