Java正則表達式超詳細講解(簡單易懂版)
前言
正則表達式是用來匹配和處理文本的強大工具。在Java中,主要通過 java.util.regex
包中的 Pattern
和 Matcher
類來實現(xiàn)。
一、基礎概念
1. 什么是正則表達式?
正則表達式(Regular Expression)是一種用來描述字符串模式的特殊語法,可以用來:
檢查字符串是否符合某種格式
從字符串中提取特定部分
替換字符串中的內(nèi)容
2. Java中正則表達式的兩個核心類:
Pattern
:編譯后的正則表達式模式Matcher
:用模式匹配字符串的引擎
二、基本語法
1. 普通字符
普通字符(字母、數(shù)字)直接匹配自身:
a
匹配字母"a"5
匹配數(shù)字"5"
2. 特殊字符(元字符)
這些字符有特殊含義,需要用\
轉(zhuǎn)義:
. ^ $ * + ? { } [ ] \ | ( )
3. 常用元字符
字符 | 說明 | 示例 |
---|---|---|
. | 匹配任意單個字符 | a.c 匹配 "abc"、"a1c" |
\d | 數(shù)字 [0-9] | \d\d 匹配 "12"、"34" |
\D | 非數(shù)字 [^0-9] | \D\D 匹配 "ab"、"##" |
\w | 單詞字符 [a-zA-Z0-9_] | \w\w 匹配 "a1"、"B_" |
\W | 非單詞字符 | \W\W 匹配 "@#"、"! " |
\s | 空白字符 [ \t\n\x0B\f\r] | a\sb 匹配 "a b" |
\S | 非空白字符 | a\Sb 匹配 "a1b" |
4. 量詞
量詞 | 說明 | 示例 |
---|---|---|
* | 0次或多次 | a* 匹配 ""、"a"、"aa" |
+ | 1次或多次 | a+ 匹配 "a"、"aa" |
? | 0次或1次 | a? 匹配 ""、"a" |
{n} | 恰好n次 | a{2} 匹配 "aa" |
{n,} | 至少n次 | a{2,} 匹配 "aa"、"aaa" |
{n,m} | n到m次 | a{2,4} 匹配 "aa"、"aaa"、"aaaa" |
正則表達式 | 描述 |
---|---|
this is text | 匹配字符串 "this is text" |
this\s+is\s+text | 注意字符串中的 \s+。 匹配單詞 "this" 后面的 \s+ 可以匹配多個空格,之后匹配 is 字符串,再之后 \s+ 匹配多個空格然后再跟上 text 字符串。 可以匹配這個實例:this is text |
^\d+(\.\d+)? | ^ 定義了以什么開始 \d+ 匹配一個或多個數(shù)字 ? 設置括號內(nèi)的選項是可選的 \. 匹配 "." 可以匹配的實例:"5", "1.5" 和 "2.21"。 |
三、Java中使用正則表達式
1. 簡單匹配示例
String text = "Hello, my phone number is 123-456-7890"; String pattern = "\\d{3}-\\d{3}-\\d{4}"; // 匹配電話號碼格式 boolean isMatch = text.matches(pattern); // false,因為matches要求整個字符串匹配 boolean contains = Pattern.compile(pattern).matcher(text).find(); // true
2. 完整使用步驟
// 1. 編譯正則表達式 Pattern p = Pattern.compile("a*b"); // 2. 創(chuàng)建匹配器 Matcher m = p.matcher("aaaaab"); // 3. 進行匹配 boolean b = m.matches(); // true
3. 常用方法
方法 | 說明 |
---|---|
matches() | 整個字符串是否匹配 |
find() | 查找下一個匹配項 |
group() | 返回匹配的字符串 |
start() /end() | 匹配的起始/結(jié)束位置 |
replaceAll() | 替換所有匹配項 |
四、實際應用示例
1. 驗證郵箱格式
String email = "test@example.com"; String regex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"; boolean isValid = email.matches(regex); // true
2. 提取所有數(shù)字
String text = "訂單123,金額456.78元"; Pattern p = Pattern.compile("\\d+\\.?\\d*"); Matcher m = p.matcher(text); while(m.find()) { System.out.println("找到數(shù)字: " + m.group()); } // 輸出: // 找到數(shù)字: 123 // 找到數(shù)字: 456.78
3. 替換字符串
String text = "2023-05-15"; String newText = text.replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$2/$3/$1"); // 結(jié)果: "05/15/2023"
五、分組和捕獲
用()
創(chuàng)建分組:
String text = "John Doe, age 30"; Pattern p = Pattern.compile("(\\w+) (\\w+), age (\\d+)"); Matcher m = p.matcher(text); if(m.find()) { System.out.println("姓名: " + m.group(1) + " " + m.group(2)); System.out.println("年齡: " + m.group(3)); } // 輸出: // 姓名: John Doe // 年齡: 30
六、常見問題
轉(zhuǎn)義問題:Java字符串中
\
需要寫成\\
正則中的
\d
→ Java字符串中寫成"\\d"
貪婪匹配:默認是貪婪匹配(匹配盡可能多的字符)
在量詞后加
?
改為非貪婪匹配:.*?
性能優(yōu)化:
重用
Pattern
對象(編譯正則表達式比較耗時)避免過度復雜的正則表達式
總結(jié)
到此這篇關于Java正則表達式的文章就介紹到這了,更多相關Java正則表達式詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在攔截器中讀取request參數(shù),解決在controller中無法二次讀取的問題
這篇文章主要介紹了在攔截器中讀取request參數(shù),解決在controller中無法二次讀取的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringMVC接收復雜集合對象(參數(shù))代碼示例
這篇文章主要介紹了SpringMVC接收復雜集合對象(參數(shù))代碼示例,舉接收List<String>、List<User>、List<Map<String,Object>>、User[]、User(bean里面包含List)幾種較為復雜的集合參數(shù),具有一定參考價值,需要的朋友可以了解下。2017-11-11spring boot多數(shù)據(jù)源動態(tài)切換代碼實例
這篇文章主要介紹了spring boot多數(shù)據(jù)源動態(tài)切換代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01SpringBoot配置開發(fā)環(huán)境的詳細步驟(JDK、Maven、IDEA等)
文章介紹了如何配置SpringBoot開發(fā)環(huán)境,包括安裝JDK、Maven和IDEA,并提供了詳細的步驟和配置方法,感興趣的朋友一起看看吧2024-12-12