java 正則表達(dá)式匹配Matcher類的使用
Matcher 類 用法
在 Java 中,Matcher
類是用于匹配正則表達(dá)式的工具,而 group()
方法是 Matcher
類中的一個(gè)重要方法,用于提取匹配結(jié)果中的捕獲組(captured groups)。以下是對(duì) group()
方法的詳細(xì)解釋:
1. 正則表達(dá)式中的捕獲組
在正則表達(dá)式中,捕獲組是通過(guò)圓括號(hào) ()
定義的。每個(gè) ()
內(nèi)的子表達(dá)式都是一個(gè)捕獲組,匹配的內(nèi)容可以被單獨(dú)提取。
例如:
String regex = "(\\d{2})-(\\d{2})-(\\d{4})";
這個(gè)正則表達(dá)式匹配日期格式(如 12-31-2023
),其中:
(\\d{2})
是第一個(gè)捕獲組,匹配月份。(\\d{2})
是第二個(gè)捕獲組,匹配日期。(\\d{4})
是第三個(gè)捕獲組,匹配年份。
2. Matcher 類的作用
Matcher
類用于對(duì)輸入字符串進(jìn)行正則表達(dá)式匹配。它通過(guò) Pattern
類的 matcher()
方法創(chuàng)建。
示例:
Pattern pattern = Pattern.compile("(\\d{2})-(\\d{2})-(\\d{4})"); Matcher matcher = pattern.matcher("12-31-2023");
3. group() 方法的作用
group()
方法用于提取匹配結(jié)果中的捕獲組。它有幾種重載形式:
(1) group()
返回整個(gè)匹配的字符串。
如果沒(méi)有匹配成功,調(diào)用此方法會(huì)拋出
IllegalStateException
。
示例:
if (matcher.find()) { System.out.println(matcher.group()); // 輸出 "12-31-2023" }
(2) group(int group)
返回指定捕獲組的匹配內(nèi)容。
捕獲組的編號(hào)從 1 開(kāi)始,
group(0)
等價(jià)于group()
,表示整個(gè)匹配的字符串。如果指定的捕獲組不存在,會(huì)拋出
IndexOutOfBoundsException
。
示例:
if (matcher.find()) { System.out.println(matcher.group(1)); // 輸出 "12"(月份) System.out.println(matcher.group(2)); // 輸出 "31"(日期) System.out.println(matcher.group(3)); // 輸出 "2023"(年份) }
(3) group(String name)(Java 7+)
返回命名捕獲組的匹配內(nèi)容。
命名捕獲組通過(guò)
(?<name>...)
語(yǔ)法定義。如果指定的命名捕獲組不存在,會(huì)拋出
IllegalArgumentException
。
示例:
Pattern pattern = Pattern.compile("(?<month>\\d{2})-(?<day>\\d{2})-(?<year>\\d{4})"); Matcher matcher = pattern.matcher("12-31-2023"); if (matcher.find()) { System.out.println(matcher.group("month")); // 輸出 "12" System.out.println(matcher.group("day")); // 輸出 "31" System.out.println(matcher.group("year")); // 輸出 "2023" }
4. group() 方法的使用步驟
編譯正則表達(dá)式:
Pattern pattern = Pattern.compile("(\\d{2})-(\\d{2})-(\\d{4})");
創(chuàng)建
Matcher
對(duì)象:Matcher matcher = pattern.matcher("12-31-2023");
執(zhí)行匹配:
使用
find()
方法查找匹配項(xiàng)。或者使用
matches()
方法檢查整個(gè)字符串是否匹配。
提取捕獲組:
使用
group()
方法提取匹配的內(nèi)容。
示例:
if (matcher.find()) { String month = matcher.group(1); // "12" String day = matcher.group(2); // "31" String year = matcher.group(3); // "2023" System.out.println("Month: " + month + ", Day: " + day + ", Year: " + year); }
5. 注意事項(xiàng)
匹配成功后才能調(diào)用
group()
:在調(diào)用
group()
之前,必須先調(diào)用find()
或matches()
方法,否則會(huì)拋出IllegalStateException
。
捕獲組編號(hào)從 1 開(kāi)始:
group(0)
表示整個(gè)匹配的字符串,group(1)
表示第一個(gè)捕獲組,依此類推。
捕獲組不存在時(shí)拋出異常:
如果指定的捕獲組編號(hào)或名稱不存在,會(huì)拋出
IndexOutOfBoundsException
或IllegalArgumentException
。
命名捕獲組需要 Java 7+:
命名捕獲組功能在 Java 7 及以上版本中支持。
6. 完整示例
以下是一個(gè)完整的示例,演示如何使用 group()
方法提取捕獲組:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void main(String[] args) { String input = "Date: 12-31-2023, Time: 23:59"; String regex = "(\\d{2})-(\\d{2})-(\\d{4}).*?(\\d{2}):(\\d{2})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); if (matcher.find()) { System.out.println("Month: " + matcher.group(1)); // "12" System.out.println("Day: " + matcher.group(2)); // "31" System.out.println("Year: " + matcher.group(3)); // "2023" System.out.println("Hour: " + matcher.group(4)); // "23" System.out.println("Minute: " + matcher.group(5));// "59" } else { System.out.println("No match found!"); } } }
總結(jié)
group()
方法是Matcher
類的核心方法,用于提取正則表達(dá)式匹配的捕獲組。捕獲組通過(guò)圓括號(hào)
()
定義,編號(hào)從 1 開(kāi)始。使用
group()
前必須調(diào)用find()
或matches()
方法。命名捕獲組(Java 7+)可以通過(guò)名稱提取匹配內(nèi)容。
find() 和 matches() 方法的區(qū)別
1. matches() 方法
作用:
檢查整個(gè)輸入字符串是否完全匹配正則表達(dá)式。
如果整個(gè)字符串與正則表達(dá)式匹配,返回
true
;否則返回false
。
匹配范圍:
必須從字符串的開(kāi)頭匹配到結(jié)尾。
示例:
String regex = "a.b"; // 匹配 "a" + 任意字符 + "b" String input1 = "aab"; String input2 = "aabb"; Pattern pattern = Pattern.compile(regex); Matcher matcher1 = pattern.matcher(input1); Matcher matcher2 = pattern.matcher(input2); System.out.println(matcher1.matches()); // true,因?yàn)?"aab" 完全匹配 "a.b" System.out.println(matcher2.matches()); // false,因?yàn)?"aabb" 不完全匹配 "a.b"
適用場(chǎng)景:
當(dāng)需要檢查整個(gè)字符串是否符合某種格式時(shí)(例如驗(yàn)證郵箱、電話號(hào)碼等)。
2. find() 方法
作用:
在輸入字符串中查找與正則表達(dá)式匹配的子串。
如果找到匹配的子串,返回
true
;否則返回false
。可以多次調(diào)用,每次調(diào)用會(huì)查找下一個(gè)匹配的子串。
匹配范圍:
不要求整個(gè)字符串匹配,只要字符串中包含與正則表達(dá)式匹配的子串即可。
示例:
String regex = "a.b"; // 匹配 "a" + 任意字符 + "b" String input = "aab aabb"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println("Found: " + matcher.group()); // 輸出匹配的子串 }
輸出:
復(fù)制
Found: aab Found: aab
適用場(chǎng)景:
當(dāng)需要從字符串中提取多個(gè)匹配的子串時(shí)(例如從日志中提取特定格式的數(shù)據(jù))。
3. find() 和 matches() 的區(qū)別
特性 | matches() | find() |
---|---|---|
匹配范圍 | 整個(gè)字符串必須完全匹配正則表達(dá)式。 | 字符串中只要包含匹配的子串即可。 |
返回值 | true 或 false 。 | true 或 false 。 |
多次調(diào)用 | 每次調(diào)用都檢查整個(gè)字符串。 | 每次調(diào)用查找下一個(gè)匹配的子串。 |
適用場(chǎng)景 | 驗(yàn)證字符串是否符合某種格式。 | 提取字符串中符合某種模式的子串。 |
到此這篇關(guān)于java 正則表達(dá)式匹配Matcher類的使用的文章就介紹到這了,更多相關(guān)java Matcher類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin語(yǔ)言編程Regex正則表達(dá)式實(shí)例詳解
這篇文章主要為大家介紹了Kotlin語(yǔ)言編程Regex正則表達(dá)式實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08java多線程join()方法的作用和實(shí)現(xiàn)原理解析(應(yīng)用場(chǎng)景)
join方法主要是用于將當(dāng)前線程掛起,等待其他線程結(jié)束后在執(zhí)行當(dāng)前線程,本文通過(guò)應(yīng)用場(chǎng)景分析代碼示例講解java多線程join()方法的作用和實(shí)現(xiàn)原理,感興趣的朋友一起看看吧2021-07-07借助Maven搭建Hadoop開(kāi)發(fā)環(huán)境的最詳細(xì)教程分享
在Maven插件的幫助下,VSCode寫(xiě)Java其實(shí)非常方便,所以本文就來(lái)和大家詳細(xì)講講如何借助maven用VScode搭建Hadoop開(kāi)發(fā)環(huán)境,需要的可以參考下2023-05-05SpringBoot?多環(huán)境打包最佳實(shí)踐記錄
SpringBoot通過(guò)配置多環(huán)境文件和在打包時(shí)指定激活的環(huán)境,實(shí)現(xiàn)多環(huán)境打包與部署,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11SpringBoot操作spark處理hdfs文件的操作方法
本文介紹了如何使用Spring Boot操作Spark處理HDFS文件,包括導(dǎo)入依賴、配置Spark信息、編寫(xiě)Controller和Service處理地鐵數(shù)據(jù)、運(yùn)行項(xiàng)目以及觀察Spark和HDFS的狀態(tài),感興趣的朋友跟隨小編一起看看吧2025-01-01Java編寫(xiě)實(shí)現(xiàn)坦克大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了Java編寫(xiě)實(shí)現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01