JavaSE正則表達(dá)式用法總結(jié)大全
常用的正則表達(dá)式匹配符
[A-Z] //匹配 A到Z任意一個(gè)字符
[a-z] //匹配 a到z任意一個(gè)字符
[0-9] //匹配 0到9任意一個(gè)數(shù)字
[^A-Z] //匹配 不是A到Z任意一個(gè)字符
[^a-z] //匹配 不是a到z任意一個(gè)字符
[^0-9] //匹配 不是0到9任意一個(gè)數(shù)字
[abcd] //匹配 abcd中的任意一個(gè)字符
abc //匹配 abc字符串區(qū)分大小寫(xiě)
(?i)abc //匹配 abc字符串不區(qū)分大小寫(xiě)
a(?i)bc //匹配 abc字符串后面的bc不區(qū)分大小寫(xiě)
a((?i)b)c //匹配 abc字符串中間的b不區(qū)分大小寫(xiě)
\\d //匹配數(shù)字字符,等價(jià)于 [0-9]。
\\D //匹配非數(shù)字字符,等價(jià)于 [^0-9]
\\w //匹配字母、數(shù)字或下劃線,等價(jià)于 [a-zA-Z0-9_]
\\W //匹配非字母、數(shù)字或下劃線,等價(jià)于 [^a-zA-Z0-9_]
\\s //匹配空白字符(包括空格、制表符、換行符等)
\\S //匹配非空白字符(包括空格、制表符、換行符等)\s的反義
. //匹配出\n外的任意字符,如果向匹配.字符本身,可以使用\\.
| //選擇匹配符,例如 ab|bc 表示匹配ab或者bc的字符串
* //指定字符重復(fù)0次或n次(無(wú)要求)零到多 示例 (abc)* 匹配輸入 abc,abcabcabc
+ //指定字符重復(fù)1次或n次(至少一次) 示例 m+(abc)* 以至少1個(gè)m開(kāi)頭,后接任意個(gè)abc的字符串 匹配輸入 m,mabc,mabcabc,mmabc
? //指定字符重復(fù)0次或1次(最多一次) 示例 m+abc? 以至少一個(gè)m開(kāi)頭,后接ab或者abc的字符串 匹配輸入 mab,mabc,mmmab,mmabc
{n} //只能輸入n個(gè)字符 [abcd]{3} 由abcd中字母組成的任意長(zhǎng)度為3的字符串 匹配輸入 abc,dbc,adc
{n,} //指定至少n個(gè)匹配 示例 [abcd]{3,} 說(shuō)明:由abcd中字母組成的任意長(zhǎng)度不小于3的字符串
{n,m} //指定至少n個(gè)但不多于m個(gè)匹配 示例 [abcd]{3,5} 說(shuō)明:由abcd中字母組成的任意長(zhǎng)度不小于3,不大于5的字符串
^ //指定起始字符 示例 ^[0-9]+[a-z]* 說(shuō)明:以至少1個(gè)數(shù)字開(kāi)頭,后接任意個(gè)小寫(xiě)字母的字符串 匹配輸入:123,6aa,555edf
$ //指定結(jié)束符 示例 ^[0-9]\\-[a-z]+$ 說(shuō)明:以1個(gè)數(shù)字開(kāi)頭后連接字符 "-" ,并以至少1個(gè)小寫(xiě)字母結(jié)尾的字符串 匹配輸入:1-a
\\b //匹配目標(biāo)字符串的邊界 示例 han\\b 說(shuō)明:這里說(shuō)的字符串邊界指的是子串間有空格,或者是目標(biāo)字符串的結(jié)束文字 匹配輸入:asfasdffate asdfafate
\\B //匹配目標(biāo)字符串的非邊界 示例 han\\B 說(shuō)明:和\b的含義剛剛相反 匹配輸入:fateafadsfafa fateafadsfasdf
(pattern) //非命名捕獲。捕獲匹配的子字符串,編號(hào)為零的第一個(gè)捕獲的是由整個(gè)正則表達(dá)式模式匹配的文本,其他捕獲結(jié)果則根據(jù)左括號(hào)的順序從1開(kāi)始自動(dòng)編號(hào)
(?<name> pattern) //命名捕獲。將匹配的子字符串捕獲到一個(gè)組名稱(chēng)或編號(hào)名稱(chēng)中,用于name的字符串不能包含任何標(biāo)點(diǎn)符號(hào),并且不能以數(shù)字開(kāi)頭
(?:pattern) //匹配 pattern 但不捕獲該匹配的子表達(dá)式,即它是一個(gè)非捕獲匹配,不存儲(chǔ)供以后使用的匹配。這對(duì)于用“or”字符(||)組合模式部件的情況很有用。例如,'industr'(?:y|lies)是對(duì)‘industry|industries'更經(jīng)濟(jì)的表達(dá)式
(?=pattren) //它是一個(gè)非捕獲匹配。例如,‘Windows(?=95|98|NT|2000)'匹配“Windows 2000”中的"Windows",但不匹配“Windows 3.1”中的“Windows”
(?!pattren) //該表達(dá)式匹配不處于匹配 pattren 的字符串的起始點(diǎn)的搜索字符串。它是一個(gè)非捕獲匹配。例如,‘Windows(?!95|98|NT|2000)'匹配“Windows 3.1”中的"Windows",但不匹配“Windows 2000”中的“Windows”
//注意點(diǎn):Java默認(rèn)是遵循貪婪匹配的,比如一個(gè)字符串為 2009 編寫(xiě)的正則表達(dá)式為 \\d+ 最后在程序執(zhí)行后 結(jié)果為 2009 (優(yōu)先匹配到數(shù)量多的 即2009)
//如果不想遵循貪婪匹配,可以在對(duì)應(yīng)的正則表達(dá)式后添加?符號(hào) 例如 \\d+? 匹配上面的結(jié)果就為2 0 0 9
//當(dāng)創(chuàng)建Pattern對(duì)象時(shí),指定Pattern.CASE_INSENSITIVE,表示匹配字符串是不區(qū)分字母大小寫(xiě)的
Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
//非命名分組和命名分組的代碼驗(yàn)證
public class Test {
public static void main(String[] args) {
String str = "mioyuimugi1989fateafadsfasdf1999 ";
//非命名分組
// String regStr = "(\\d\\d)(\\d\\d)";//匹配連續(xù)的4個(gè)數(shù)字
//命名分組
String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配連續(xù)的4個(gè)數(shù)字
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println("找到:"+matcher.group(0));
System.out.println("找到分組[1]="+matcher.group(1));
System.out.println("找到分組[g1]="+matcher.group("g1"));
System.out.println("找到分組[2]="+matcher.group(2));
System.out.println("找到分組[g2]="+matcher.group("g2"));
}
}
}
運(yùn)行結(jié)果截圖:

public class Test {
public static void main(String[] args) {
//非捕獲分組 (?:pattern) 代碼演示如下
//不能使用 matcher.group(1)
String str = "輕音少女2009 輕音少女2010 輕音少女2011";
String regExp = "輕音少女(?:2009|2010|2011)";
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("找到:"+matcher.group(0));
}
}
}
運(yùn)行結(jié)果截圖:

public class Test {
public static void main(String[] args) {
//非捕獲分組 (?!pattern) 代碼演示如下
//不能使用 matcher.group(1)
String str = "輕音少女2009 輕音少女2010 輕音少女2011 輕音少女2025";
String regExp = "輕音少女(?!2009|2010|2011)";
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("找到:"+matcher.group(0));//該模式下匹配到的是輕音少女2025
}
}
}
運(yùn)行結(jié)果截圖:

public class Test {
public static void main(String[] args) {
//默認(rèn)貪婪匹配和非貪婪匹配的區(qū)別和演示
String str = "輕音少女2009 輕音少女2010 輕音少女2011 輕音少女2025";
String regExp = "\\d+";//默認(rèn)貪婪匹配
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(str);
System.out.println("============================貪婪模式下匹配結(jié)果=========================");
while (matcher.find()) {
System.out.println("找到:"+matcher.group(0));
}
regExp = "\\d+?";//改成了非貪婪匹配
pattern = Pattern.compile(regExp);
matcher = pattern.matcher(str);
System.out.println("============================非貪婪模式下匹配結(jié)果=========================");
while (matcher.find()) {
System.out.println("找到:"+matcher.group(0));
}
}
}
運(yùn)行結(jié)果截圖:

public class Test {
public static void main(String[] args) {
//默認(rèn)貪婪匹配和非貪婪匹配的區(qū)別和演示
String str = "輕音少女2009 輕音少女2010 輕音少女2011 輕音少女2025";
String regExp = "\\d*";//默認(rèn)貪婪匹配
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(str);
System.out.println("============================貪婪模式下匹配結(jié)果=========================");
while (matcher.find()) {
System.out.println("找到:"+matcher.group(0));
}
regExp = "\\d*?";//改成了非貪婪匹配
pattern = Pattern.compile(regExp);
matcher = pattern.matcher(str);
System.out.println("============================非貪婪模式下匹配結(jié)果=========================");
while (matcher.find()) {
System.out.println("找到:"+matcher.group(0));
}
}
}
運(yùn)行結(jié)果截圖:


正則表達(dá)式常用的類(lèi)
java.util.regex 包主要包括以下三個(gè)類(lèi) Pattern類(lèi)、Matcher類(lèi)和PatternSyntaxException
Pattern類(lèi)
- Pattern對(duì)象時(shí)一個(gè)正則表達(dá)式對(duì)象,Pattern類(lèi)沒(méi)有公共構(gòu)造方法,要構(gòu)建一個(gè)Pattern對(duì)象,需要調(diào)用其公共靜態(tài)方法,它返回一個(gè)Pattern對(duì)象,該方法結(jié)束一個(gè)正則表達(dá)式作為它的一個(gè)參數(shù),比如:Pattern p = Pattern.compile(pattern);
Matcher類(lèi)
- Mattcher對(duì)象時(shí)對(duì)輸入字符串進(jìn)行解釋和匹配的引擎。與Pattern類(lèi)一樣,Matcher也沒(méi)有公共構(gòu)造方法,你需要調(diào)用Pattern對(duì)象的matcher方法來(lái)獲得一個(gè)Matcher對(duì)象
PatternSyntaxException類(lèi)
- PatternSyntaxException是一個(gè)非強(qiáng)制異常類(lèi),它表示一個(gè)正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤。
分組、捕獲、反向引用
分組
- 我們可以用圓括號(hào)組成一個(gè)比較復(fù)雜的匹配模式,那么一個(gè)圓括號(hào)的部分我們可以看作一個(gè)子表達(dá)式/一個(gè)分組
捕獲
- 把正則表達(dá)式中子表達(dá)式/分組匹配的內(nèi)容,保存到內(nèi)存中以數(shù)字編號(hào)或顯式命名的組里,方便后面引用,從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為1,以此類(lèi)推。組0代表的是整個(gè)正則式。
反向引用
- 圓括號(hào)的內(nèi)容被捕獲后,可以在這個(gè)括號(hào)后被使用,從而寫(xiě)出一個(gè)比較實(shí)用的匹配模式,這個(gè)我們稱(chēng)之為方向引用,這種引用即可以是在正則表達(dá)式內(nèi)部,也可以是在正則表達(dá)式外部,內(nèi)部反向引用\分組號(hào),外部反向引用 $分組號(hào)。
反向引用題型案例
要匹配兩個(gè)連續(xù)的相同的數(shù)字。
String reg = "(\\d)\\1";
要匹配五個(gè)連續(xù)的相同數(shù)字。
String reg = "(\\d)\\1{4}";要匹配個(gè)位與千位相同,十位與百位相同的數(shù) 5225,1551。
String reg = "(\\d)(\\d)\\2\\1";
請(qǐng)?jiān)谧址袡z索商品編號(hào),形式如:12321-333999111這樣的號(hào)碼,要求滿(mǎn)足前面是一個(gè)五位數(shù),然后一個(gè)-號(hào),然后是一個(gè)九位數(shù),連續(xù)的每三位要相同。
String reg = "\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";
正則表達(dá)式應(yīng)用實(shí)例
要求編寫(xiě)符合下面要求格式的正則表達(dá)式
漢字
String regExp ="^[\\u4E00-\\u9FFF]+$";//注意編碼,該正則表達(dá)式是在UTF-8上實(shí)現(xiàn)的
郵政編碼
要求:是1-9開(kāi)頭的一個(gè)六位數(shù)。比如:123890
String regExp = "^[1-9]\\d{5}$";QQ號(hào)碼
要求:是1-9開(kāi)頭的一個(gè)(5位數(shù)-10位數(shù))比如:12389,1345687,187698765
String regExp = "^[1-9]\\d{4,9}$";手機(jī)號(hào)碼
要求:必須以13,14,15,18 開(kāi)頭的11位數(shù),比如 13588889999
String regExp = "^1(?:3|4|5|8)\\d{9}$";檢查請(qǐng)求的url地址是否符合格式
public class Test { public static void main(String[] args) { String url = "https://www.bilibili.com/video/BV1Eq4y1E79W?spm_id_from=333.788.player.switch&vd_source=008f4bb261040622b4b9810f1577d84a&p=17"; /** * 思路: * 1,最前面的可能是 https:// 或http:// 或沒(méi)有 -> ((http|https)://)? * 2,中間www.bilibili.com 可以拆分成兩個(gè)部分 即 xxx. 和 后面的 xxx * 其中xxs包含的字符可能有數(shù)字,大小寫(xiě)字母,下劃線和- 前后兩個(gè)部分都可能含有一個(gè)或多個(gè) -> ([\\w-]\.)+([\\w-])+ * 3, 最后的一個(gè)部分以/開(kāi)頭,后面包含的字符可能有數(shù)字,下劃線,大小寫(xiě)英語(yǔ)和一些特殊字符(包括?.#=-%&) */ String regExp = "((http|https)://)?([\\w-]+\\.)+[\\w-]+(\\/[\\w-/?.#%&=]*)?";//注意當(dāng)[.?]情況時(shí).?符號(hào)匹配的就是本身 Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(url); if (matcher.find()) { System.out.println("滿(mǎn)足格式="+matcher.group(0)); } else { System.out.println("不滿(mǎn)足格式"); } //以下為整體匹配 System.out.println(Pattern.matches(regExp,url)); } }注意當(dāng)[.?]情況時(shí).?符號(hào)匹配的就是本身
運(yùn)行結(jié)果截圖:

6. 經(jīng)典的結(jié)巴程序
把類(lèi)似:“我…我要…學(xué)學(xué)學(xué)學(xué)…編程java!”通過(guò)正則表達(dá)式 修改成"我要學(xué)編程java"
public class RegExpDemo1 { public static void main(String[] args) { String content = "我....我要....學(xué)學(xué)學(xué)學(xué)....編程java!"; System.out.println("content="+content); //1 去除所有的. 使用\\. String reg = "\\."; content = content.replaceAll(reg,""); System.out.println("content="+content); //2 (1) 找到所有的疊詞 (.)\\1+ // (2) 對(duì)找到的引用進(jìn)行反向引用替換$1 content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1"); //或者如下面一行代碼 //content = content.replaceAll("(.)\\1+","$1"); System.out.println("content="+content); } }運(yùn)行結(jié)果截圖:

7. 將該"JDK1.3 JDK1.4"中的JDK1.3和JDK1.4全面替換成JDK
public class RegExpDemo1 {
public static void main(String[] args) {
String content = "JDK1.3 JDK1.4";
System.out.println("content="+content);
content = content.replaceAll("(JDK)(?:1.3|1.4)","$1");
System.out.println("content="+content);
}
}
運(yùn)行結(jié)果截圖:

驗(yàn)證電子郵件格式是否合法(要求如下)
只能有一個(gè)@
@前面是用戶(hù)名,可以是a-z,A-Z,0-9 _字符
@后面的是域名,并且域名只能是英語(yǔ)字母,比如sohu.com 或者tsinghua.org.cn
寫(xiě)出對(duì)應(yīng)的正則表達(dá)式,驗(yàn)證輸入的字符串是否滿(mǎn)足規(guī)則
public class RegExpDemo1 { public static void main(String[] args) { //驗(yàn)證郵箱格式是否正確 //1. 只能有一個(gè)@ //2. @前面是用戶(hù)名,可以是a-z,A-Z,0-9 _字符 //3. @后面的是域名,并且域名只能是英語(yǔ)字母,比如sohu.com 或者tsinghua.org.cn String regExp = "^[\\w-]+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//因?yàn)槭沁M(jìn)行匹配,建議將前后的定位符加上 String emailStr = "1234_sss@tsinghua.org.cn"; if (emailStr.matches(regExp)) {//該方法是進(jìn)行整體匹配的 System.out.println("該郵箱格式正確!"+emailStr); } else { System.out.println("該郵箱格式不正確!"+emailStr); } } }運(yùn)行結(jié)果截圖:


要求驗(yàn)證是不是整數(shù)或者小數(shù)
- 注意:該題要考慮正數(shù)和負(fù)數(shù) 比如:123 +123 -345 34.89 -87.9 -0.001 0.45 等 不符合要的數(shù)據(jù)實(shí)例 --123 ++123 0035 01.01
public class RegExpDemo1 {
public static void main(String[] args) {
//要求驗(yàn)證是不是整數(shù)或者小數(shù)
//注意:該題要考慮正數(shù)和負(fù)數(shù) 比如:123 -345 34.89 -87.9 -0.001 0.45 等
String numStr = "+45";
String regExp = "^[-+]?([1-9]\\d*|0)(\\.\\d+)?$";
if (numStr.matches(regExp)) {
System.out.println("匹配成功,是整數(shù)或小數(shù)!"+numStr);
} else {
System.out.println("匹配不成功,不是整數(shù)或小數(shù)!"+numStr);
}
}
}
運(yùn)行結(jié)果截圖:






對(duì)一個(gè)url進(jìn)行解析 例如 https://www.sohu.com:8080/abc/index.htm
. 要求得到的協(xié)議是什么? http
域名是什么? ww.sohu.com
端口是什么? 8080
文件名是什么?index.htm
public class RegExpDemo1 { public static void main(String[] args) { String url = "https://www.sohu.com:8080/abc/index.htm"; //如果有其他情況或者一些特殊字符什么的,可以對(duì)正則表達(dá)式內(nèi)容進(jìn)行適當(dāng)?shù)恼{(diào)整 String regExp = "^(?<g1>[a-zA-Z]+)://(?<g2>([\\w-]+\\.)+[\\w-]+)(?<g3>:[\\d]{1,5})/[\\w-/?.#%&=]*/(?<g4>[\\w-]+(\\.[\\w]+))?$"; Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(url); if (matcher.find()) { System.out.println("解析成功,結(jié)果如下"); System.out.println("解析出的協(xié)議為:"+matcher.group("g1")); System.out.println("解析出的域名為:"+matcher.group("g2")); System.out.println("解析出的端口為:"+matcher.group("g3")); System.out.println("解析出的文件名為:"+matcher.group("g4")); } else { System.out.println("解析失敗"); } } }運(yùn)行結(jié)果截圖:

總結(jié)
到此這篇關(guān)于JavaSE正則表達(dá)式用法總結(jié)大全的文章就介紹到這了,更多相關(guān)JavaSE正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springcloud-eureka注冊(cè)時(shí)的ip問(wèn)題
這篇文章主要介紹了解決springcloud-eureka注冊(cè)時(shí)的ip問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java重點(diǎn)梳理類(lèi)與對(duì)象核心原理
類(lèi)(class)和對(duì)象(object)是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱(chēng)。對(duì)象是對(duì)客觀事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型2022-07-07
java new一個(gè)對(duì)象的過(guò)程實(shí)例解析
這篇文章主要介紹了java new一個(gè)對(duì)象的過(guò)程實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
在Spring Boot中實(shí)現(xiàn)多環(huán)境配置的方法
在SpringBoot中,實(shí)現(xiàn)多環(huán)境配置是一項(xiàng)重要且常用的功能,它允許開(kāi)發(fā)者為不同的運(yùn)行環(huán)境,這種方式簡(jiǎn)化了環(huán)境切換的復(fù)雜度,提高了項(xiàng)目的可維護(hù)性和靈活性,本文給大家介紹在Spring Boot中實(shí)現(xiàn)多環(huán)境配置的方法,感興趣的朋友跟隨小編一起看看吧2024-09-09
Java實(shí)現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼
這篇文章主要介紹了如何利用Java語(yǔ)言自制一個(gè)偵探文字游戲—《角色扮演偵探》,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-02-02
java ArrayList和Vector的區(qū)別詳解
這篇文章主要介紹了java ArrayList和Vector的區(qū)別詳解的相關(guān)資料,并附簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下2016-11-11
springboot集成WebSockets廣播消息(推薦)
這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
java-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)
下面小編就為大家?guī)?lái)一篇java-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10

