一文講透 Java Regex正則表達(dá)式!
正則表達(dá)式是一種用于描述字符串模式的工具,它在文本處理、數(shù)據(jù)驗(yàn)證、搜索和替換等方面有著廣泛的應(yīng)用。這篇文章,我們將分析什么是正則表達(dá)式以及它是如何工作的?
什么是正則表達(dá)式?
正則表達(dá)式(regular expression,常簡(jiǎn)寫(xiě)為 regex、regexp 或 RE),又稱規(guī)律表達(dá)式、正規(guī)表示式、正規(guī)表示法、規(guī)則運(yùn)算式、常規(guī)表示法,是計(jì)算機(jī)科學(xué)概念,用簡(jiǎn)單字串來(lái)描述、匹配文中全部符合指定格式的字串,現(xiàn)在很多文本編輯器都支援用正則表達(dá)式搜尋、取代符合指定格式的字串。
Java Regex是一種用于匹配字符串的模式,它可以用來(lái)驗(yàn)證、查找、替換或拆分字符串。Java中的正則表達(dá)式由 java.util.regex包提供,主要由 3 個(gè)類和 1 個(gè)接口組成:
- Pattern Class:表示正則表達(dá)式的編譯表示。
- Matcher Class:用于執(zhí)行匹配操作的引擎。
- PatternSyntaxException Class:表示正則表達(dá)式語(yǔ)法錯(cuò)誤的異常。
- MatchResult Interface:用于表示匹配操作的結(jié)果。
正則表達(dá)式組成
Java 正則表達(dá)式主要由以下幾部分組成:
- 字符類:用于匹配指定范圍內(nèi)的任意字符。例如[a-z]表示匹配任意小寫(xiě)字母。
- 預(yù)定義字符類:簡(jiǎn)化的字符類。例如\d表示匹配任意數(shù)字,\w表示匹配任意字母、數(shù)字或下劃線。
- 量詞:用于指定字符或子表達(dá)式的重復(fù)次數(shù)。例如a*表示匹配零次或多次 a,a{2,4}表示匹配 2 到 4 次 a。
- 邊界匹配符:用于匹配字符串的邊界。例如^表示匹配字符串的開(kāi)始,$表示匹配字符串的結(jié)束。
- 分組:用于將多個(gè)字符或子表達(dá)式組合在一起。例如(abc)表示匹配字符串 "abc"。
下面還列舉了一些常見(jiàn)的正則表達(dá)式元素:
- .: 匹配除換行符以外的任意單字符
- *: 匹配前面的子表達(dá)式零次或多次
- +: 匹配前面的子表達(dá)式一次或多次
- ?: 匹配前面的子表達(dá)式零次或一次
- \d: 匹配一個(gè)數(shù)字字符,[0-9] 的縮寫(xiě)
- \D 匹配任何非數(shù)字,[^0-9] 的縮寫(xiě)
- \s 任何空格字符,[\t\n\x0B\f\r] 的縮寫(xiě)
- \S 任何非空格字符,是 [^\s] 的縮寫(xiě)
- \w: 匹配一個(gè)字母、數(shù)字或下劃線字符
- [abc]: 匹配方括號(hào)內(nèi)的任意一個(gè)字符
- ^: 匹配字符串的開(kāi)始
- $: 匹配字符串的結(jié)束
更多表達(dá)式,參考: regexr
Regex 類詳解
1.Matcher
Matcher類實(shí)現(xiàn) MatchResult 接口,它是一個(gè)正則表達(dá)式引擎,用于對(duì)字符序列執(zhí)行匹配操作。主要包含以下方法:
- boolean matches():測(cè)試正則表達(dá)式是否與模式匹配。
- boolean find():找到與模式匹配的下一個(gè)表達(dá)式。
- boolean find(int start):找到與給定起始編號(hào)中的模式匹配的下一個(gè)表達(dá)式。
- String group():返回匹配的子序列。
- int start():返回匹配子序列的起始索引。
- int end():返回匹配子序列的結(jié)束索引。
- int groupCount():返回匹配子序列的總數(shù)。
2.Pattern
Pattern類是正則表達(dá)式的編譯版本,用于定義正則表達(dá)式引擎的模式。主要包含以下方法:
- static Pattern compile(String regex):編譯給定的正則表達(dá)式并返回 Pattern 的實(shí)例。
- Matcher matcher(CharSequence input):創(chuàng)建一個(gè)匹配器,該匹配器將給定的輸入與模式匹配。
- static boolean matches(String regex, CharSequence input):它作為編譯和匹配器方法的組合工作。它編譯正則表達(dá)式并將給定的輸入與模式匹配。
- String[] split(CharSequence input):圍繞給定模式的匹配項(xiàng)拆分給定的輸入字符串。
- String pattern():返回正則表達(dá)式模式。
3.PatternSyntaxException
PatternSyntaxException 類是拋出未經(jīng)檢查的異常,指示正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤。主要包含以下方法:
- int getIndex():檢索異常的索引
- String getDescription():檢索異常的描述信息
- String getPattern():檢索錯(cuò)誤的正則表達(dá)式模式
4.MatchResult
MatchResult接口主要用于匹配操作的結(jié)果。此接口包含用于確定與正則表達(dá)式匹配的結(jié)果的查詢方法。匹配邊界、組和組邊界可以通過(guò)。主要包含以下方法:
- int start():返回匹配的開(kāi)始索引
- int start(int group):返回本次匹配期間給定組捕獲的子序列的起始索引。
- int end():返回最后一個(gè)匹配字符后的偏移量。
- int end(int group):返回本次匹配期間給定組捕獲的子序列的最后一個(gè)字符后的偏移量。
- String group():返回與上一個(gè)匹配項(xiàng)匹配的輸入子序列。
- String group(int group):返回上一次匹配操作期間給定組捕獲的輸入子序列。
- int groupCount():返回此匹配結(jié)果模式中的捕獲組的數(shù)量。
正則使用場(chǎng)景
正則使用場(chǎng)景主要包含以下類型:
- 輸入驗(yàn)證,比如郵箱驗(yàn)證,手機(jī)號(hào)驗(yàn)證,URL 驗(yàn)證,密碼強(qiáng)度驗(yàn)證
- 文本搜索和替換,比如查找特定模式,替換特定模式
- 文本拆分,比如按照空白字符拆分字符串
- 日志和數(shù)據(jù)解析,比如提取IP地址,提取日期和時(shí)間
- 數(shù)據(jù)清洗,比如刪除HTML標(biāo)簽,格式化字符串
- 編譯器和解釋器,比如識(shí)別標(biāo)識(shí)符、關(guān)鍵字、操作符等
- 數(shù)據(jù)庫(kù)查詢,比如使用 SQL 的 REGEXP 運(yùn)算符進(jìn)行復(fù)雜的模式匹配查詢。
- 文件名匹配,比如查找所有以 .txt 結(jié)尾的文件
除了上面的場(chǎng)景,正則表達(dá)式還可以使用到其他的場(chǎng)景,需要根據(jù)具體的場(chǎng)景而定。
示例演示
1.郵箱驗(yàn)證
驗(yàn)證郵箱地址是一個(gè)常見(jiàn)的正則表達(dá)式應(yīng)用場(chǎng)景。首先,我們需要一個(gè)能夠驗(yàn)證郵箱地址的正則表達(dá)式。一個(gè)常見(jiàn)的用于驗(yàn)證郵箱的正則表達(dá)式如下:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
該正則表達(dá)式的解釋如下:
- ^:匹配字符串的開(kāi)始。
- [a-zA-Z0-9._%+-]+:匹配一個(gè)或多個(gè)字母、數(shù)字、點(diǎn)、下劃線、百分號(hào)、加號(hào)或減號(hào)。
- @:匹配@符號(hào)。
- [a-zA-Z0-9.-]+:匹配一個(gè)或多個(gè)字母、數(shù)字、點(diǎn)或減號(hào)。
- \.:匹配一個(gè)點(diǎn)。
- [a-zA-Z]{2,}:匹配兩個(gè)或更多的字母。
- $:匹配字符串的結(jié)束。
下面是一個(gè)完整的 Java示例代碼:
import java.util.regex.*;
public class EmailValidator {
public static void main(String[] args) {
String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
String[] emails = {
"valid.email@example.com",
"invalid-email@example",
"another.valid.email@example.co.uk",
"invalid.email@.com",
"valid_email123@example.org"
};
Pattern pattern = Pattern.compile(emailPattern);
for (String email : emails) {
Matcher matcher = pattern.matcher(email);
boolean isMatch = matcher.matches();
System.out.println("Email: " + email + " is valid? " + isMatch);
}
}
}
運(yùn)行結(jié)果:
Email: valid.email@example.com is valid? true
Email: invalid-email@example is valid? false
Email: another.valid.email@example.co.uk is valid? true
Email: invalid.email@.com is valid? false
Email: valid_email123@example.org is valid? true
在上述代碼中:
- Pattern.compile(emailPattern):編譯正則表達(dá)式。
- pattern.matcher(email):創(chuàng)建一個(gè)匹配器對(duì)象,用于匹配給定的郵箱字符串。
- matcher.matches():檢查整個(gè)字符串是否與正則表達(dá)式匹配。
2.拆分字符串
在下面的示例中,正則表達(dá)式\s+表示一個(gè)或多個(gè)空白字符。split方法用于將字符串按匹配的模式拆分為多個(gè)部分。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String pattern = "\\s+";
String text = "Split this string by spaces.";
Pattern compiledPattern = Pattern.compile(pattern);
String[] parts = compiledPattern.split(text);
for (String part : parts) {
System.out.println(part);
}
}
}
3.查找子字符串
在下面示例中,正則表達(dá)式\d+表示一個(gè)或多個(gè)數(shù)字字符。find方法用于查找所有匹配的子字符串。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String pattern = "\\d+";
String text = "There are 123 apples and 456 oranges.";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
while (matcher.find()) {
System.out.println("Found a number: " + matcher.group());
}
}
}
總結(jié)
正則表達(dá)式是一種功能強(qiáng)大且靈活的工具,能夠極大地提高字符串處理的效率和精度。正則表達(dá)式的技術(shù)難度不大,但是很難記憶,而且在輸入驗(yàn)證、文本搜索和替換、文本拆分、日志和數(shù)據(jù)解析、數(shù)據(jù)清洗、編譯器和解釋器等應(yīng)用場(chǎng)景使用比較多。所以,掌握正則表達(dá)式還是有很大幫助。