Java正則表達(dá)式之Pattern和Matcher的使用
前言
之前簡(jiǎn)單分析了Java正則表達(dá)式的基礎(chǔ)用法和部分規(guī)則:String.matches方法使用
今天來看一下常用來處理正則表達(dá)式的兩個(gè)類:
Pattern
包名:java.util.regex.Pattern;
Pattern 類用于表示一個(gè)正則表達(dá)式的編譯版本。通過 Pattern.compile() 方法可以將一個(gè)正則表達(dá)式編譯成一個(gè) Pattern 對(duì)象。
Pattern 類提供了一系列靜態(tài)方法用于編譯和匹配正則表達(dá)式,例如 compile()、matches()、split() 等。
通過 Pattern 對(duì)象可以獲取正則表達(dá)式的相關(guān)信息,例如正則表達(dá)式的字符串表示、標(biāo)志位等。
Matcher
包名:java.util.regex.Matcher;
Matcher 類用于對(duì)輸入字符串進(jìn)行匹配操作。它通過 Pattern.matcher() 方法創(chuàng)建,并用于對(duì)指定的輸入字符串執(zhí)行匹配操作。
Matcher 類提供了一系列方法用于執(zhí)行匹配操作,例如 matches()、find()、group() 等。
通過 Matcher 對(duì)象可以獲取匹配結(jié)果的相關(guān)信息,例如匹配的子字符串、匹配的位置等。
一、Pattern和Matcher的簡(jiǎn)單使用
簡(jiǎn)單例子代碼:
package com.example.Pattern; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternTest { public static void main(String[] args) { String input = "Hello, my age is 25 and my friend's age is 30."; // 定義正則表達(dá)式 String regex = "\\d+"; // 匹配一個(gè)或多個(gè)數(shù)字 // 編譯正則表達(dá)式為 Pattern 對(duì)象 Pattern pattern = Pattern.compile(regex); // 創(chuàng)建 Matcher 對(duì)象,并使用正則表達(dá)式匹配輸入字符串 Matcher matcher = pattern.matcher(input); // 查找匹配的數(shù)字 while (matcher.find()) { System.out.println("Found: " + matcher.group()); } } }
result
:
分析:\\d+
是匹配1到n個(gè)數(shù)字,至于find
和group
功能后面詳解,看樣子find
方法匹配到就返回true,同時(shí)group
方法返回捕獲到的內(nèi)容。帶著這個(gè)簡(jiǎn)單的例子進(jìn)入到兩個(gè)類的詳細(xì)分析。
二、Pattern詳解
2.1 Pattern 常用方法
2.1.1 compile(String regex)
compile(String regex):
compile 方法是 Pattern 類的靜態(tài)方法,用于將給定的正則表達(dá)式字符串編譯成一個(gè) Pattern 對(duì)象。
該方法接受一個(gè)字符串參數(shù) regex,表示要編譯的正則表達(dá)式。
編譯成功后,將返回一個(gè) Pattern 對(duì)象,可以用于后續(xù)的匹配操作。
示例
: 上面已經(jīng)有了,不重復(fù)了。
2.1.2 matches(String regex, CharSequence input)
matches(String regex, CharSequence input):
matches 方法是 Pattern 類的靜態(tài)方法,用于嘗試將給定的正則表達(dá)式與整個(gè)輸入字符串進(jìn)行匹配。
該方法接受一個(gè)字符串參數(shù) regex,表示要匹配的正則表達(dá)式,以及一個(gè) CharSequence 參數(shù) input,表示要匹配的輸入字符串。
如果整個(gè)輸入字符串與正則表達(dá)式匹配成功,則返回 true;否則返回 false。
示例
:
public class PatternTest { public static void main(String[] args) { String input = "Hello, my age is 25 and my friend's age is 30."; // 定義正則表達(dá)式 String regex = "\\d+"; // 匹配一個(gè)或多個(gè)數(shù)字 System.out.println(Pattern.matches(regex, "2")); System.out.println(Pattern.matches(regex, "20")); System.out.println(Pattern.matches(regex, " ")); System.out.println(Pattern.matches(regex, "1 2 3 4 ")); System.out.println(Pattern.matches(regex, "abcd")); } }
result
:
analysis
:
字符串 “2” 符合正則表達(dá)式 “\d+”,它包含一個(gè)數(shù)字字符。
字符串 “20” 也符合正則表達(dá)式 “\d+”,它包含兩個(gè)數(shù)字字符。
字符串 " " 不符合正則表達(dá)式 “\d+”,它不包含任何數(shù)字字符。
字符串 "1 2 3 4 " 不符合正則表達(dá)式 “\d+”,它包含空格和數(shù)字字符,不是一個(gè)連續(xù)的數(shù)字字符串。
字符串 “abcd” 不符合正則表達(dá)式 “\d+”,它不包含任何數(shù)字字符。
2.1.3 split(CharSequence input)
split(CharSequence input):
split 方法用于根據(jù)正則表達(dá)式將輸入字符串分割成多個(gè)子字符串。
該方法接受一個(gè) CharSequence 參數(shù) input,表示要分割的輸入字符串。
返回一個(gè)字符串?dāng)?shù)組,包含了根據(jù)正則表達(dá)式分割后的子字符串。
示例
:
public static void main(String[] args) { System.out.println("-------,測(cè)試--------"); String text = "apple,banana,orange,pear"; Pattern pattern = Pattern.compile(","); String[] result = pattern.split(text); for (String s : result) { System.out.println(s); } System.out.println("-------\\d+測(cè)試--------"); String text1 = "1234,banana,2234,pear"; Pattern pattern1 = Pattern.compile("\\d+"); String[] result1 = pattern1.split(text1); for (String s : result1) { System.out.println(s); } System.out.println("-------\\d測(cè)試--------"); String text2 = "1234,banana,2234,pear"; Pattern pattern2 = Pattern.compile("\\d"); String[] result2 = pattern2.split(text2); for (String s : result2) { System.out.println(s); } }
result
:
analysis
:
字符串 “,” 截取了“,”,所以只剩下數(shù)字和字母。
字符串 “\d+” 截取了連續(xù)的數(shù)字,所以只剩下“,”和字母。
字符串 “\d"截取了單個(gè)的數(shù)字,所有相比于”\d+"有了很多換行符。
2.1.4 pattern()
pattern():
pattern 方法用于返回當(dāng)前 Pattern 對(duì)象所表示的正則表達(dá)式的字符串形式。
該方法不接受任何參數(shù),直接返回當(dāng)前 Pattern 對(duì)象的正則表達(dá)式字符串。
示例
:
public static void main(String[] args) { Pattern pattern = Pattern.compile(","); String result = pattern.pattern(); System.out.println(result); Pattern pattern1 = Pattern.compile("\\d+"); String result1 = pattern1.pattern(); System.out.println(result1); Pattern pattern2 = Pattern.compile("\\d"); String result2 = pattern2.pattern(); System.out.println(result2); }
result
:
analysis
:
該方法不接受任何參數(shù),直接返回當(dāng)前 Pattern 對(duì)象的正則表達(dá)式字符串。
2.1.5 matcher(CharSequence input)
matcher(CharSequence input):
matcher 方法用于創(chuàng)建一個(gè) Matcher 對(duì)象,用于對(duì)指定的輸入字符串進(jìn)行匹配操作。
該方法接受一個(gè) CharSequence 參數(shù) input,表示要匹配的輸入字符串。
返回一個(gè) Matcher 對(duì)象,可以用于后續(xù)的匹配操作。
示例
:
public static void main(String[] args) { Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法創(chuàng)建 Pattern 對(duì)象 Matcher matcher = pattern.matcher("1234,banana,2234,pear"); // 使用 Pattern 對(duì)象創(chuàng)建 Matcher 對(duì)象 System.out.println(pattern); System.out.println(matcher); }
result
:
analysis
:
Pattern.compile(“\d+”) 返回的是正則表達(dá)式 \d+ 的字符串表示形式。而 pattern.matcher(“1234,banana,2234,pear”) 返回的是 Matcher 對(duì)象的字符串表示形式,其中包含了正則表達(dá)式模式、匹配的區(qū)域和最后的匹配結(jié)果。
三、Matcher詳解
3.1 Matcher 常用方法
3.1.1 matches()
matches():
matches 方法嘗試將整個(gè)輸入字符串與模式進(jìn)行匹配。
如果整個(gè)輸入字符串與模式匹配成功,則返回 true;否則返回 false。
示例
:
public static void main(String[] args) { Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法創(chuàng)建 Pattern 對(duì)象 Matcher matcher = pattern.matcher("1234"); // 使用 Pattern 對(duì)象創(chuàng)建 Matcher 對(duì)象 System.out.println(matcher.matches()); matcher = pattern.matcher("1234d"); System.out.println(matcher.matches()); matcher = pattern.matcher("12.34"); System.out.println(matcher.matches()); }
result
:
analysis
:
matcher.matches() 會(huì)嘗試對(duì)整個(gè)輸入字符串進(jìn)行匹配,如果整個(gè)輸入字符串匹配成功,則返回 true,否則返回 false。
當(dāng)輸入字符串為 “1234” 時(shí),由于整個(gè)字符串都是數(shù)字,匹配成功,因此輸出為 true。
當(dāng)輸入字符串為 “1234d” 時(shí),由于字符串中包含非數(shù)字字符 “d”,匹配失敗,因此輸出為 false。
當(dāng)輸入字符串為 “12.34” 時(shí),由于字符串中包含小數(shù)點(diǎn) “.”,匹配失敗,因此輸出為 false。
3.1.2 find()
絕大多數(shù)情況下:find()和group()方法是搭配起來使用的。
find():
find 方法在輸入字符串中查找下一個(gè)匹配的子序列。
如果找到匹配的子序列,則返回 true;否則返回 false。
3.1.3 group()
group():
group 方法返回當(dāng)前匹配的子序列。
如果在調(diào)用 matches、find 等方法后找到了匹配的子序列,可以使用 group 方法獲取匹配的內(nèi)容。
示例
:
public static void main(String[] args) { Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法創(chuàng)建 Pattern 對(duì)象 Matcher matcher = pattern.matcher("1234,banana,2234,pear"); while (matcher.find()) { System.out.println("匹配的子序列:" + matcher.group()); } matcher = pattern.matcher("1234banana2234pear"); while (matcher.find()) { System.out.println("匹配的子序列:" + matcher.group()); } }
result
:
analysis
:
非常簡(jiǎn)單
find 方法在輸入字符串中查找下一個(gè)匹配的子序列。
group 方法返回當(dāng)前匹配的子序列。
3.1.4 start()
start():
start 方法返回當(dāng)前匹配的子序列的起始索引。
如果在調(diào)用 matches、find 等方法后找到了匹配的子序列,可以使用 start 方法獲取匹配子序列的起始索引。
3.1.5 end()
end():
end 方法返回當(dāng)前匹配的子序列的結(jié)束索引。
如果在調(diào)用 matches、find 等方法后找到了匹配的子序列,可以使用 end 方法獲取匹配子序列的結(jié)束索引。
示例
:
public static void main(String[] args) { Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法創(chuàng)建 Pattern 對(duì)象 Matcher matcher = pattern.matcher("1234,banana,2234,pear,911"); while (matcher.find()) { System.out.println("匹配的子序列:" + matcher.group()); System.out.println("起始子序列:" + matcher.start()); System.out.println("結(jié)束子序列:" + matcher.end()); System.out.println(); } }
result
:
analysis
:
第一個(gè)匹配的子序列為 “1234”,起始位置是 0,結(jié)束位置是 4。
第二個(gè)匹配的子序列為 “2234”,起始位置是 12,結(jié)束位置是 16。
第三個(gè)匹配的子序列為 “911”,起始位置是 22,結(jié)束位置是 25。
3.1.6 reset(CharSequence input)
reset(CharSequence input):
reset 方法將 Matcher 對(duì)象的狀態(tài)重置,使其可以重新在輸入字符串中進(jìn)行匹配。
在重復(fù)使用 Matcher 對(duì)象進(jìn)行匹配時(shí),可以使用 reset ()方法清除之前的匹配狀態(tài)。
示例
:
public static void main(String[] args) { Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法創(chuàng)建 Pattern 對(duì)象 Matcher matcher = pattern.matcher("1234,banana,2234"); // 第一次匹配 while (matcher.find()) { System.out.println("第一次匹配的子序列:" + matcher.group()); System.out.println("第一次起始子序列:" + matcher.start()); System.out.println("第一次結(jié)束子序列:" + matcher.end()); System.out.println(); } // 重置 Matcher 對(duì)象 matcher.reset("456,orange,789"); // 第二次匹配 while (matcher.find()) { System.out.println("第二次匹配的子序列:" + matcher.group()); System.out.println("第二次起始子序列:" + matcher.start()); System.out.println("第二次結(jié)束子序列:" + matcher.end()); System.out.println(); } }
result
:
analysis
:
第一次匹配之后,我們調(diào)用了 reset() 方法并提供了一個(gè)新的輸入字符串,這樣 Matcher 對(duì)象的匹配狀態(tài)就被重置了,可以重新從新的輸入字符串中查找匹配的子序列,并輸出相應(yīng)的信息。
總結(jié)
Pattern 類是正則表達(dá)式的編譯表示形式。它通過 compile() 方法將正則表達(dá)式編譯為一個(gè) Pattern 對(duì)象,然后可以使用這個(gè)對(duì)象來創(chuàng)建 Matcher 對(duì)象。Pattern 類提供了一系列靜態(tài)方法和實(shí)例方法,用于對(duì)正則表達(dá)式進(jìn)行編譯、匹配和其他操作。
Matcher 類是用于對(duì)輸入字符串進(jìn)行正則表達(dá)式匹配操作的對(duì)象。它通過 Pattern 對(duì)象的 matcher() 方法創(chuàng)建,并提供了一系列方法用于進(jìn)行匹配、查找、替換等操作。Matcher 對(duì)象可以重復(fù)使用,也可以通過 reset() 方法重置其匹配狀態(tài)。
到此這篇關(guān)于Java正則表達(dá)式之Pattern和Matcher的使用的文章就介紹到這了,更多相關(guān)Java Pattern Matcher內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解OpenAPI開發(fā)如何動(dòng)態(tài)的添加接口實(shí)現(xiàn)
這篇文章主要為大家介紹了OpenAPI開發(fā)如何動(dòng)態(tài)的添加接口實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04基于OpenCV與JVM實(shí)現(xiàn)矩陣處理圖像
本文主要介紹了Java圖像處理實(shí)戰(zhàn)之基于OpenCV與JVM實(shí)現(xiàn)矩陣處理圖像。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)圖像處理有一定的幫助,感興趣的可以試一試2022-01-01POI導(dǎo)出之Excel實(shí)現(xiàn)單元格的背景色填充問題
這篇文章主要介紹了POI導(dǎo)出之Excel實(shí)現(xiàn)單元格的背景色填充問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03