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