💡 正則表達式(Regular Expression, regex)知識點總結 💡
正則表達式是一種用于匹配字符串的模式,廣泛用于搜索、替換、驗證等操作。
📌 正則表達式的主要作用
1?? 字符串匹配 🧐
- 檢查一個字符串是否符合某種模式。
- 例如,驗證用戶輸入的郵箱、手機號、密碼強度等。
2?? 搜索和提取 🔍
- 在大量文本中找到符合要求的內容。
- 例如,從網頁中提取URL、郵箱、電話號碼等。
3?? 字符串替換 🔄
- 將符合規則的文本替換為指定內容。
- 例如,把多個空格替換成一個空格。
4?? 數據格式化 ??
- 規范化文本數據,如日期格式轉換、去除特殊字符等。
5?? 日志分析 📊
- 通過正則表達式分析日志文件,提取錯誤信息或IP 地址等重要數據。
📌 正則表達式的基礎
-
普通字符匹配:
abc
只能匹配"abc"
,不會匹配"aabc"
、"abcd"
等。
-
特殊字符(元字符):
元字符 含義 示例 .
任意單個字符(換行符除外) "a.c"
可匹配"abc"
、"aac"
\d
數字 [0-9]
"12\d"
可匹配"123"
、"125"
\w
字母、數字或下劃線 [a-zA-Z0-9_]
"\w+"
可匹配"hello123"
\s
空白字符(空格、制表符、換行符) "a\sb"
可匹配"a b"
\b
單詞邊界 "\bcat\b"
匹配"cat"
但不匹配"catalog"
^
匹配行首 "^abc"
只匹配"abc"
在行首的情況$
匹配行尾 "xyz$"
只匹配"xyz"
在行尾的情況
📌 量詞(控制匹配次數)
量詞 | 含義 | 示例 |
---|---|---|
* | 匹配 0 次或多次 | a* 匹配 "" 、"a" 、"aaaa" |
+ | 匹配 1 次或多次 | a+ 匹配 "a" 、"aaaa" ,但不匹配 "" |
? | 匹配 0 次或 1 次 | a? 匹配 "" 、"a" |
{n} | 匹配 n 次 | a{3} 僅匹配 "aaa" |
{n,} | 至少匹配 n 次 | a{2,} 匹配 "aa" 、"aaa" |
{n,m} | 匹配 n 到 m 次 | a{2,4} 匹配 "aa" 、"aaa" 、"aaaa" |
📌 字符類(Character Classes)
語法 | 含義 | 示例 |
---|---|---|
[abc] | 只匹配 a 或 b 或 c | gr[ae]y 可匹配 "gray" 或 "grey" |
[^abc] | 除 a、b、c 以外的任何字符 | "[^aeiou]" 匹配所有輔音字母 |
[0-9] | 匹配 0~9 的任何數字 | "[0-9]+" 匹配 "123" 、"456" |
[a-z] | 匹配小寫字母 | "[a-z]+" 匹配 "hello" |
[A-Z] | 匹配大寫字母 | "[A-Z]+" 匹配 "HELLO" |
📌 邏輯運算符
語法 | 含義 | 示例 |
---|---|---|
` | ` | 邏輯 OR(或) |
() | 分組 | "(ab)+" 可匹配 "ab" 、"abab" |
(?:...) | 非捕獲分組 | "(?:ab)+" 僅匹配 "abab" ,但不存儲匹配內容 |
📌 零寬斷言
? 下面是正則表達式中 (?=)
等相關的零寬斷言的作用和示例,整理成表格供你參考 📜👇
表達式 | 名稱 🏷 | 作用 💡 | 示例 |
---|---|---|---|
(?=...) | 正向先行斷言 ? | 匹配當前位置,后面必須滿足 ... 的條件,但不消耗字符 | \d(?=px) 匹配**5px 中的 5 **,但不匹配 5em |
(?!...) | 負向先行斷言 ? | 匹配當前位置,后面不能是 ... | \d(?!px) 匹配 5em 的 5 ,但不匹配 5px |
(?<=...) | 正向后行斷言 🔄 | 匹配當前位置,前面必須滿足 ... | (?<=\$)\d+ 匹配**$100 中的 100 **,但不匹配 USD100 |
(?<!...) | 負向后行斷言 🚫 | 匹配當前位置,前面不能是 ... | (?<!\$)\d+ 匹配 USD100 的 100 ,但不匹配 $100 |
💡 小貼士:
- 先行斷言(
(?=...)
&(?!...)
)檢查后面的字符,但不消耗它們。 - 后行斷言(
(?<=...)
&(?<!...)
)檢查前面的字符,但不消耗它們。 - 斷言是零寬匹配(不占字符),用于復雜匹配規則!
📌 貪婪模式與懶惰模式
在正則表達式中,貪婪模式(Greedy Mode)指的是匹配時盡可能多地匹配字符。
例如:
a.*b
在"acbcb"
上的貪婪匹配結果是"acbcb"
(盡可能匹配最長的內容)。- 如果使用 懶惰模式(Lazy Mode)
a.*?b
,則匹配的結果是"acb"
(盡可能匹配最短的內容)。
? 貪婪匹配(Greedy Match)VS 懶惰匹配(Lazy Match):
模式 | 符號 | 行為 |
---|---|---|
貪婪匹配(Greedy) | .* | 盡可能多地匹配 |
懶惰匹配(Lazy) | .*? | 盡可能少地匹配 |
占有匹配(Possessive) | .*+ | 一次性匹配,不回溯 |
💡 記住:貪婪(Greedy)匹配會盡可能多地匹配字符,而懶惰(Lazy)匹配會盡可能少地匹配字符。🚀
📌 捕獲分組與非捕獲分組
📌 常見正則表達式
1?? 匹配郵箱 📧:
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
? 可匹配 "test.email@example.com"
2?? 匹配手機號 📱(以中國手機號 1
開頭):
^1[3-9]\d{9}$
? 可匹配 "13812345678"
3?? 匹配 IP 地址 🌐:
^(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.
(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.
(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])\.
(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])$
? 可匹配 "192.168.1.1"
4?? 匹配日期(YYYY-MM-DD) 📆:
^(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
? 可匹配 "2024-03-14"
📌 Java 正則表達式示例
import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String text = "hello regex 123!";String pattern = "\\d+"; // 匹配數字Pattern p = Pattern.compile(pattern);Matcher m = p.matcher(text);while (m.find()) {System.out.println("匹配到: " + m.group());}}
}
🔹 輸出:
匹配到: 123
📌 小結
? 正則表達式的核心知識點:
? 元字符(特殊字符):.
\d
\w
\s
^
$
? 量詞:*
+
?
{n,m}
? 字符類:[abc]
[a-z]
[^0-9]
? 邏輯運算:|
()
? 常見應用:郵箱、手機號、IP 地址等