java正則表達(dá)式之Pattern與Matcher類詳解
Pattern.split方法詳解
/**
* 測(cè)試Pattern.split方法
*/
@Test
public void testPatternSplit() {
String str = "{0x40, 0x11, 0x00, 0x00}";
// 分割符為:逗號(hào), {,}, 空白符
String regex = "[,\\{\\}\\s]";
Pattern pattern = Pattern.compile(regex);
/*
* 1. split 方法用于使用正則表達(dá)式中的字符分割待匹配的字符串
*
* 注意:
* 1. 如果分割符位于原字符串的起始位置,則分割的時(shí)候,會(huì)在起始位置上分割出一個(gè)""出來(lái)
* 2. 如果有連續(xù)兩個(gè)分隔符,則會(huì)在這兩個(gè)分割符之間分割有一個(gè)""出來(lái)
* */
System.out.println("----------- split test -----------");
String[] results = pattern.split(str);
System.out.println("length :" + results.length);
for (int i = 0; i < results.length; i++) {
System.out.println("element_" +i + " :" + results[i]);
}
System.out.println(Arrays.toString(results));
/*
* 2. split方法的limit參數(shù)的意思是使用正則表達(dá)式的分割字符將原字符串分為limit個(gè)組
* **/
System.out.println("\n----------- split limit test -----------");
String[] resultsLimit = pattern.split(str, 2);
for (int i = 0; i < resultsLimit.length; i++) {
System.out.print(resultsLimit[i]);
}
}
結(jié)果:
----------- split test -----------
element_0 :
element_1 :0x40
element_2 :
element_3 :0x11
element_4 :
element_5 :0x00
element_6 :
element_7 :0x00
[, 0x40, , 0x11, , 0x00, , 0x00]----------- split limit test -----------
0x40, 0x11, 0x00, 0x00}
Matcher的find/find/start/end方法詳解
- 測(cè)試Matcher的find方法:嘗試在目標(biāo)字符串中查找下一個(gè)匹配的字串,需在循環(huán)中迭代。
- groupCount :返回當(dāng)前查找所獲得的匹配組的數(shù)量,不包括整個(gè)整個(gè)正則表達(dá)式的匹配。
比如,表達(dá)式有兩個(gè)子分組,則groupCount == 2 - group(i):指的是用()包含的子分組,按照定義的順序標(biāo)識(shí)下標(biāo),當(dāng)正則表達(dá)式中使用 |連接分組,那么有的分組匹配的字串可能為null。
- start(group):返回此子分組匹配的子串在原字符串中的起始位置(包含)
end(group):返回此子分組匹配的子串在原字符串中的結(jié)束位置(不包含)
即子分組匹配的字符串在原字符串的位置為 [start(i),end(i)),左閉右開。
@Test
public void testMatcherGroupFindStartEnd() {
String str = "{0x40, 0x31, 0x20, 0x00}";
String regex = "([A-Za-z0-9]+)(,)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
// 對(duì)于在整個(gè)原字符串中,找到的下一個(gè)匹配的字串
while (matcher.find()) {
// 輸出groupCount的數(shù)量
System.out.println("groupCount : " + matcher.groupCount());
// 0-輸出整個(gè)匹配
System.out.println("the substring of contains all group : " + matcher.group(0));
System.out.println("group_0 start index : " + matcher.start(0) + " end :" + matcher.end(0));
// 依次輸出子分組的匹配結(jié)果
// 如果子分組之間是通過(guò) | 來(lái)連接的,則子分組的匹配結(jié)果有的為null
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("group_" + i + ":" + matcher.group(i));
System.out.println("group_" + i + " start index : " + matcher.start(i) + " end :" + matcher.end(i));
}
}
}
結(jié)果:
groupCount : 2
the substring of contains all group : 0x40,
group_0 start index : 1 end :6
group_1:0x40
group_1 start index : 1 end :5
group_2:,
group_2 start index : 5 end :6
groupCount : 2
the substring of contains all group : 0x31,
group_0 start index : 7 end :12
group_1:0x31
group_1 start index : 7 end :11
group_2:,
group_2 start index : 11 end :12
groupCount : 2
the substring of contains all group : 0x20,
group_0 start index : 13 end :18
group_1:0x20
group_1 start index : 13 end :17
group_2:,
group_2 start index : 17 end :18
Matcher的replace/append方法詳解
測(cè)試Matcher的匹配替換以及追加的方法:
- matcher.replaceAll方法 :替換在原字符串中所有被正則表達(dá)式匹配的字串,并返回替換之后的結(jié)果
- matcher.replaceFirst方法 :替換在原字符串中第一個(gè)被正則表達(dá)式匹配的字串,并返回替換之后的結(jié)果
- matcher.appendReplacement方法 : 將當(dāng)前匹配子串替換為指定字符串,并且將替換后的子串以及其之前到上次匹配子串之后的字符串段添加到一個(gè)StringBuffer對(duì)象里(需while(matcher.find())進(jìn)行配合迭代)
- matcher.appendTail(StringBuffer sb) 方法則將最后一次匹配工作后剩余的字符串添加到一個(gè)StringBuffer對(duì)象里。
3和4的結(jié)合能夠?qū)崿F(xiàn)將原字符串中的某些字串替換指定字符,并返回完成替換之后的結(jié)果
@Test
public void testMatcherReplaceAppend() {
String str = "{0x40, 0x31, 0x20, 0x00}";
String regex = "([0-9A-Za-z]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
// replaceAll
System.out.println("----------- replace all test ----------");
String replacedAllStr = matcher.replaceAll("replace");
System.out.println("replaced : " + replacedAllStr);
//matcher.reset(str); // 重置被matcher的字符串
matcher.reset(); // 重置matcher,以實(shí)現(xiàn)對(duì)原字符串重新搜索
// replaceFirst
System.out.println("------------ replace first test ---------");
String replacedFirstStr = matcher.replaceFirst("replace");
System.out.println("replaced first : " + replacedFirstStr);
matcher.reset();
// appendReplacement
System.out.println("------------- appendReplacement test ------------");
StringBuffer appendRepStr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(appendRepStr,"0xffff");
}
System.out.println(appendRepStr);
// 最后調(diào)用appendTail將匹配剩余的字符串添加都StringBuffer的末尾
// 注意這時(shí)要實(shí)現(xiàn)完整的功能:將所有匹配的內(nèi)容替換并添加到appendRepStr中,剩余未匹配的繼續(xù)添加到
// appendRepStr中,相當(dāng)于對(duì)原字符串進(jìn)行全部的替換
// 此時(shí)要保證,在遍歷所有匹配的字串后調(diào)用appendTail方法
System.out.println("------------ appendTail test ---------------");
matcher.appendTail(appendRepStr);
System.out.println(appendRepStr);
}
結(jié)果:
----------- replace all test ----------
replaced : {replace, replace, replace, replace}
------------ replace first test ---------
replaced first : {replace, 0x31, 0x20, 0x00}
------------- appendReplacement test ------------
{0xffff, 0xffff, 0xffff, 0xffff
------------ appendTail test ---------------
{0xffff, 0xffff, 0xffff, 0xffff}
測(cè)試文件源碼地址
https://github.com/zhanglbjames/exercises/blob/master/src/test/java/huawei_8_16/TestT1.java
1-匹配字符類
方括號(hào)一次只能匹配括號(hào)內(nèi)的一個(gè)字符
[abc]
a, b, or c (簡(jiǎn)單類)
[^abc]
除了a、b或c之外的任意 字符(求反)
[a-zA-Z]
a到z或A到Z ,包含(范圍)
[a-zA-Z0-9]
匹配一次所有數(shù)字和字母的類型
[a-b-r]
匹配 a-b ,連接符 -,r
注意如果想要連接符起到范圍的作用,應(yīng)該滿足如下格式[a-bc-de-gf-k]
即每個(gè)連接符占用的字符不能被其他連接符占用
圓括號(hào)一次匹配多個(gè)字符
- 比如方括號(hào)的正則表達(dá)式"t[aeio]n"只匹配"tan"、"Ten"、"tin"和"ton",只能匹配單個(gè)字符,不能匹配"taeion"
- 圓括號(hào)可以一次匹配多個(gè)字符,比如使用"t(a|e|i|o|oo)n"正則表達(dá)式,可以匹配"taen","tan","taeiooon"等
也可以配合[]使用,如正則為"t([aei]|o|oo)n",則可以匹配 "taon","teoon",但是不能匹配"taeioon"
2-預(yù)定義字符類
. 匹配除換行符 \n 之外的任何單字符
比如:表達(dá)式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”。
- \d 數(shù)字: [0-9]
- \D 非數(shù)字: [^0-9]
- \s 空格符: [ \t\n\x0B\f\r]
- \S 非空格符: [^\s]
- \w 單詞字符: [a-zA-Z_0-9]
- \W 非單詞字符: [^\w]
記憶規(guī)則 大寫表示取反,小寫如下記憶
d:digit(數(shù)字)
s:space(空白字符)
w:word(單詞字符), 注意包括下劃線
3-表達(dá)式匹配次數(shù)
* 0次或者多次(允許0次的貪婪匹配)
例如,zo* 能匹配 "z" 以及 "zoo"。* 等價(jià)于{0,}
+ 1次或者多次(貪婪匹配)
例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
? 0次或者1次 (非貪婪匹配,允許0次)
例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價(jià)于 {0,1}。
{n} 恰好n次
{n,m} 從n次到m次
{n,} 至少n次
注意上述n為非負(fù)數(shù)
4-特殊字符需要轉(zhuǎn)義

總結(jié)
到此這篇關(guān)于java正則表達(dá)式之Pattern與Matcher類的文章就介紹到這了,更多相關(guān)java正則表達(dá)式Pattern與Matcher類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用Socket和IO流實(shí)現(xiàn)文件的上傳與下載
本文主要介紹了Java利用Socket和IO流實(shí)現(xiàn)文件的上傳與下載,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
mybatis一對(duì)多兩種mapper寫法實(shí)例
這篇文章主要介紹了mybatis一對(duì)多兩種mapper寫法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
java去除中文括號(hào)小括號(hào),或者英文括號(hào)的實(shí)例代碼
這篇文章主要介紹了java去除中文括號(hào)小括號(hào),或者英文括號(hào)的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
idea快速實(shí)現(xiàn)將SpringBoot項(xiàng)目打包Docker鏡像并部署
本文主要介紹了idea快速實(shí)現(xiàn)將SpringBoot項(xiàng)目打包Docker鏡像并部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
解決spring-boot-starter-web等報(bào)紅問(wèn)題
這篇文章主要介紹了解決spring-boot-starter-web等報(bào)紅問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流
這篇文章主要介紹了SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

