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

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));
}
}
}
運行結果截圖:

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
}
}
}
運行結果截圖:

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

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


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

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

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);
}
}
運行結果截圖:

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


要求驗證是不是整數(shù)或者小數(shù)
- 注意:該題要考慮正數(shù)和負數(shù) 比如:123 +123 -345 34.89 -87.9 -0.001 0.45 等 不符合要的數(shù)據(jù)實例 --123 ++123 0035 01.01
public class RegExpDemo1 {
public static void main(String[] args) {
//要求驗證是不是整數(shù)或者小數(shù)
//注意:該題要考慮正數(shù)和負數(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);
}
}
}
運行結果截圖:






對一個url進行解析 例如 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"; //如果有其他情況或者一些特殊字符什么的,可以對正則表達式內容進行適當?shù)恼{整 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("解析成功,結果如下"); 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("解析失敗"); } } }運行結果截圖:

總結
到此這篇關于JavaSE正則表達式用法總結大全的文章就介紹到這了,更多相關JavaSE正則表達式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在Spring Boot中實現(xiàn)多環(huán)境配置的方法
在SpringBoot中,實現(xiàn)多環(huán)境配置是一項重要且常用的功能,它允許開發(fā)者為不同的運行環(huán)境,這種方式簡化了環(huán)境切換的復雜度,提高了項目的可維護性和靈活性,本文給大家介紹在Spring Boot中實現(xiàn)多環(huán)境配置的方法,感興趣的朋友跟隨小編一起看看吧2024-09-09
Java實現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼
這篇文章主要介紹了如何利用Java語言自制一個偵探文字游戲—《角色扮演偵探》,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編學習一下2022-02-02
java ArrayList和Vector的區(qū)別詳解
這篇文章主要介紹了java ArrayList和Vector的區(qū)別詳解的相關資料,并附簡單實例代碼,需要的朋友可以參考下2016-11-11
springboot集成WebSockets廣播消息(推薦)
這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12

