💡 正则表达式(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 地址等