导语:你是否被这些场景逼疯过?
正则表达式(RegEx)就是解决这些问题的终极神器!今天用一篇文章的时间,带你从零解锁这个「程序员必备神技」,让文本处理效率原地起飞 🚀
简单来讲:正则表达式 = 文本世界的「万能搜索公式」
学术来讲:正则表达式是一门语言,用来描述一组字符串特征的模式,用来匹配特定的字符串。
用一套特殊符号组合,精准描述你要找的文本模式。 举个例子🌰:
runoo+b
能匹配 runoob
、runooob
(+
表示前面的 o
至少出现 1 次)colou?r
能匹配 color
或 colour
(?
表示前面的 u
可出现 0 次或 1 次)核心价值:
正则的灵魂是「元字符」,学会它们就掌握了 80% 的功力! 我们按功能分成 6 大类,搭配直观案例👇
符号 | 作用 | 经典案例 |
---|---|---|
. | 匹配任意单个字符(除换行) | a.c 匹配 abc、a&c |
\d | 匹配数字 | \d{3} 匹配 123 |
^ | 匹配字符串开头 | ^Error 匹配行首的错误日志 |
$ | 匹配字符串结尾 | \.jpg$ 匹配 jpg 结尾的文件名 |
符号 | 作用 | 贪婪模式 vs 懒惰模式 |
---|---|---|
* | 匹配 0 次或多次 | a.*b 匹配最长的 a...b(贪婪) |
+ | 匹配 1 次或多次 | go+gle 匹配 google(至少 1 个 o) |
? | 匹配 0 次或 1 次 | a.*?b 匹配最短的 a...b(懒惰) |
(\d{4})-(\d{2})-(\d{2}) // 匹配日期,$1=$年,$2=$月,$3=$日
为什么只需要给前面的“{”加转义,后面的“}”为什么没加?
在正则表达式中,{
和 }
是一对特殊符号,它们一起用来表示“重复次数”。如果单独出现 {
,正则表达式会误以为后面要写重复次数,所以需要用反斜杠 \
把它“锁住”,告诉正则表达式这只是普通字符 {
。而单独的 }
没有这种“误导性”,所以不需要转义。
|
:一次性匹配多种可能color|colour // 同时匹配美式/英式拼写
[]
:定制化匹配范围[aeiou] // 匹配任意元音字母
[a-z0-9] // 匹配小写字母或数字
无需匹配具体字符,仅靠位置锁定目标!
(?=pattern)
:右侧必须是pattern
(?<=\$)\d+ // 匹配美元符号后的数字(如 $299 中的 299)
(?<!pattern)
:左侧不能是pattern
(?<!www\.)\w+\.net // 匹配非www开头的.com域名(如 ai-as.net) 1[3-9]\d{9}
解析:以 1 开头,第二位 3-9,后跟 9 位数字(覆盖所有运营商)。\w+@\w+\.[a-z]{2,4}
解析:用户名 +@+ 域名 + 后缀(支持 com、cn 等常见域名)。需求:提取日志中的 IP 地址(如 192.168.1.1
)
(?:\d{1,3}\.){3}\d{1,3}
关键点:非捕获分组 (?:)
避免冗余匹配,{3}
确保 3 段点分数字。
需求:提取 HTML 标签中的文本(如 <title>正则教程</title>
中的 正则教程
)
(?<=<(\w+)>).*(?=<\/\1>)
核心逻辑:利用反向断言定位标签开头,正向断言定位标签结尾,\1
引用分组匹配的标签名。
在编程语言中使用正则时,需注意双重转义!
.
需写为 \\d\\.
第一层:Java 字符串转义 \
为 \
;第二层:正则引擎转义 \
为原义字符。r"\d\."
避免额外转义。a.*b
在 aabbaabb
中匹配整个字符串?
):a.*?b
仅匹配最短的 aab
应用场景:解析 HTML 时务必用懒惰模式,避免匹配跨标签内容。(?:)
不占用编号:
(a(?:b|c)d)
中,$1
是 a
,$2
是 d
((?:b|c)
不计数)。((a)(b))
中,$1
是整体,$2
是 a
,$3
是 b
。. \d \w ^ $ * +
()
和分支 |
2023-08-15
)(?=)(?<=)
¥199
)推荐工具: