Java中使用正則表達(dá)式的詳細(xì)教程
正則表達(dá)式基礎(chǔ)語(yǔ)法
Java正則表達(dá)式基于java.util.regex包,核心類是Pattern和Matcher。基本語(yǔ)法遵循標(biāo)準(zhǔn)正則規(guī)范:
- . 匹配任意單個(gè)字符(除換行符)
- \d 匹配數(shù)字,等價(jià)于 [0-9]
- \w 匹配單詞字符,等價(jià)于 [a-zA-Z0-9_]
- \s 匹配空白字符(空格、制表符等)
- [] 字符集合,如 [abc] 匹配a、b或c
- ^ 在字符集中表示否定,如 [^abc] 匹配非a/b/c的字符
- * 匹配前一個(gè)元素0次或多次
- + 匹配前一個(gè)元素1次或多次
- ? 匹配前一個(gè)元素0次或1次
- {n} 精確匹配n次
- {n,} 匹配至少n次
- {n,m} 匹配n到m次
- | 寫在方括號(hào)外面,表示或
- && 交集,表示與
- (?!) 忽略后面字符的大小寫
常用預(yù)定義字符類
\\d 數(shù)字 [0-9] \\D 非數(shù)字 [^0-9] \\s 空白字符 [ \\t\\n\\x0B\\f\\r] \\S 非空白字符 [^\\s] \\w 單詞字符 [a-zA-Z_0-9] \\W 非單詞字符 [^\\w]
邊界匹配符
^ 匹配行首 $ 匹配行尾 \b 匹配單詞邊界 \B 匹配非單詞邊界
Java中的特殊處理
在Java字符串中需要使用雙反斜杠轉(zhuǎn)義:
// 匹配數(shù)字的正則表達(dá)式 String regex = "\\d+"; // 實(shí)際表示 \d+
Pattern和Matcher使用示例
import java.util.regex.*;
String text = "Hello 123 World";
// Pattern:表示正則表達(dá)式
Pattern pattern = Pattern.compile("\\d+");
// Matcher:文本匹配器,從頭開始讀取,直到讀取到匹配的字符串
Matcher matcher = pattern.matcher(text);
// 查找匹配
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
// 匹配整個(gè)字符串
boolean isMatch = Pattern.matches("Hello.*", text);- 貪婪爬取:用+,*,表示盡可能多的獲取數(shù)據(jù)
- 非貪婪爬?。涸?,*后面加上?,表示盡可能少的獲取數(shù)據(jù)
String str = "aaaaaaaaaabbbbbbbbaaaaaaaaa";
System.out.println("--------- 貪婪匹配 ---------");
// 貪婪匹配
Pattern p = Pattern.compile("ab+");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
System.out.println("--------- 懶惰匹配 ---------");
// 懶惰匹配
Pattern p1 = Pattern.compile("ab+?");
Matcher m1 = p1.matcher(str);
while (m1.find()) {
System.out.println(m1.group());
}效果圖:

分組和捕獲
使用()創(chuàng)建捕獲組:
String str = "a123a";
String str1 = "abc123abc";
String str2 = "1117891111";
String str3 = "aa7879a";
// 捕獲分組
System.out.println("--------- 捕獲分組 ---------");
String regex = "(.).+\\1";
String regex1 = "(.+).+\\1";
String regex2 = "((.)\\2).+\\1";
System.out.println(str.matches(regex));
System.out.println(str1.matches(regex1));
System.out.println(str2.matches(regex2));
System.out.println(str3.matches(regex2));
// 非捕獲分組
System.out.println("--------- 非捕獲分組 ---------");
String str4 = "我要學(xué)學(xué)變變變變撐撐撐撐撐";
str4 = str4.replaceAll("(.)\\1+", "$1");// replaceAll() 方法用于把所有滿足匹配的字符串替換成指定的字符串
System.out.println(str4);效果圖:

- 從1開始,連續(xù)不斷
- 以左括號(hào)為基準(zhǔn)
- 捕獲分組(默認(rèn)):① 內(nèi)部:\組號(hào) ② 外部:$組號(hào)(組號(hào)會(huì)保留下來(lái))
- 非捕獲分組:使用條件,不占組號(hào)
- "?=":表示任一數(shù)據(jù)
- "?:":表示所有數(shù)據(jù)
- "?!":表示不包含這些數(shù)據(jù)
常用正則表達(dá)式示例
- 郵箱驗(yàn)證:
String emailRegex = "^[\\w-_.+]*[\\w-_.]@([\\w]+\\.)+[\\w]+[\\w]$"; - 手機(jī)號(hào)驗(yàn)證(中國(guó)大陸):
String phoneRegex = "^1[3-9]\\d{9}$"; - 身份證號(hào)驗(yàn)證(簡(jiǎn)易版):
String idCardRegex = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$"; - URL驗(yàn)證:
String urlRegex = "^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$";
特殊匹配模式
通過(guò)Pattern的常量設(shè)置匹配模式:
// 不區(qū)分大小寫匹配
Pattern.CASE_INSENSITIVE
// 多行模式(^和$匹配每行的開頭和結(jié)尾)
Pattern.MULTILINE
// 示例:不區(qū)分大小寫匹配
Pattern.compile("hello", Pattern.CASE_INSENSITIVE).matcher("Hello").find(); // true字符串替換
使用正則表達(dá)式進(jìn)行字符串替換:
String text = "a1b2c3";
String replaced = text.replaceAll("\\d", "-"); // a-b-c-性能優(yōu)化建議
預(yù)編譯常用正則表達(dá)式:
private static final Pattern EMAIL_PATTERN = Pattern.compile(emailRegex);
- 避免過(guò)度使用.通配符,盡可能明確匹配范圍
- 對(duì)于簡(jiǎn)單固定字符串匹配,優(yōu)先使用String.contains()或String.startsWith()等原生方法
- 謹(jǐn)慎使用回溯量大的表達(dá)式(如嵌套的量詞)
到此這篇關(guān)于Java中使用正則表達(dá)式的正確打開方式的文章就介紹到這了,更多相關(guān)Java中使用正則表達(dá)式的正確打開方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
kill命令在Java應(yīng)用中使用的注意事項(xiàng)小結(jié)
這篇文章主要給大家介紹了關(guān)于kill命令在Java應(yīng)用中使用的注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
java8時(shí)間間隔類Duration和Period示例代碼
文章解釋了Java中Duration和Period的區(qū)別,并提供了它們的特點(diǎn)、適用場(chǎng)景和常見用途,文中還提供了每個(gè)類的常用方法和示例,感興趣的朋友一起看看吧2026-04-04
Java數(shù)據(jù)結(jié)構(gòu)--時(shí)間和空間復(fù)雜度
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)的時(shí)間和空間復(fù)雜度,小編覺得這篇文寫的不錯(cuò),感興趣的朋友可以了解下,希望能夠給你帶來(lái)幫助2021-08-08
java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Java自動(dòng)化獲取Excel工作表名稱的示例代碼
Spire.XLS for Java,作為一個(gè)專業(yè)的 Java Excel 庫(kù),能輕松完成從轉(zhuǎn)換 Excel 工作表到編輯,復(fù)制等一系列難易程度不同的任務(wù),下面我們來(lái)看看如何使用它實(shí)現(xiàn)自動(dòng)化快速獲取所有工作表名稱吧2025-10-10
Java的Synchronized關(guān)鍵字學(xué)習(xí)指南(全面 & 詳細(xì))
這篇文章主要給大家介紹了關(guān)于Java的Synchronized關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

