正则表达式
首先,正则表达式的语法不是很重要。在 AI 时代,你只需要把你要搜索的东西,你的搜索需求,描述给 AI, AI 会处理好一切的。 其次,你也不能啥都不会,不然容易 AI 搞半天都写不正确,你可以记不住语法,但你得看得懂,看到了就记起来了的程度。
元字符表:
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
字符转义
\
,\
符号可以让后面的字符被转义成符号本身,而不是带有特殊功能的符号
常用限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
字符类
语法:使用[]
方括号括起来,在内容中填写规则
分枝条件:从左向右匹配
语法:使用|
竖线把不同的规则隔开
Tip
匹配分支条件时,会从左到右地测试每个条件,如果满足了某个分枝,就不会再向下搜索。
分组:使用括号分组
使用括号分组,eg:匹配 IP 地址,设置每个字段的规则,再重复3次
反义:大写
查找不属于某个能简单定义的字符类的字符
常见反义代码如下:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
后向引用、零宽断言、负向零宽断言
有点懵,暂省略
零宽断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,指定的是位置
语法:用来填写前缀后缀的,(?<=exp)
匹配前缀后的东西,或 (?=exp)
匹配后缀之前的东西
为什么叫断言?
语法断言自身 (被匹配出来的内容) 出现的位置前面/后面的内容 (exp) 能匹配表达式。
注释
语法:(?#comment)
,要包含注释的话,最好是启用“忽略模式里的空白符”选项,以便达到下面的效果:
(?<= # 断言要匹配的文本的前缀
<(\w+)> # 查找尖括号括起来的内容
# (即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容
# 查找尖括号括起来的内容
) # 后缀结束
贪婪与懒惰匹配
字面意思,贪婪——尽可能多的匹配;懒惰——尽可能少的匹配。
贪婪匹配:.*
懒惰匹配:
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
C# 中的正则处理选项
在C#中,你可以使用Regex(String, RegexOptions)
构造函数来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
名称 | 说明 |
---|---|
IgnoreCase(忽略大小写) | 匹配时不区分大小写。 |
Multiline(多行模式) | 更改^和的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) |
Singleline(单行模式) | 更改.的含义,使它与每一个字符匹配(包括换行符\n)。 |
IgnorePatternWhitespace(忽略空白) | 忽略表达式中的非转义空白并启用由#标记的注释。 |
ExplicitCapture(显式捕获) | 仅捕获已被显式命名的组。 |
练习题目
匹配手机号
匹配 11 位数字,并且第一位必须是
1
题目:
✅ 13812345678
❌ 23812345678
❌ 1381234567
答案:
1\d{10}
更好的答案:
^1\d{10}$
限制了前后缀,避免匹配字符串中间的符合要求的字符
匹配邮箱地址
要求:邮箱必须满足: 用户名前面可以有字母、数字、下划线、点 必须有一个 @ 后面是字母或数字开头的域名,带一个 . 再接字母结尾
题目:
✅ abc123@gmail.com
✅ my.name_1@outlook.cn
❌ @gmail.com
❌ abc@com
答案:
\w(.*)@+\w*\.+\w*
ATM PIN 检查
只允许 4 位数字 或 6 位数字
题目:
1234
123456
1264984894
asdf
123a
答案:
(^\d{4}$)|(^\d{6}$)
更简洁的答案:
^(\d{4}|\d{6})$
4. 提取日期 (YYYY-MM-DD)
要求:从一段文字中 提取出所有合法的日期,格式为
2025-08-17
这种
文本
今天是2025-08-17,明天是2025-08-18。
提取结果:
2025-08-17
2025-08-18
答案:
\d{4}(-\d{2}){2}
5. 提取 HTML 标签里的内容
要求:匹配所有
<title> ... </title>
中间的内容
<html><head><title>Hello World</title></head></html>
输出:
Hello World
答案:
(?<=<title>).+?(?=</title>)
Tip
在实际业务中,可能需要抓取跨行的 HTML 代码,此时应该启用跨行抓取,比如 Python 中的
re.DOTALL
或者re.s
,C# 中的RegexOptions.Singleline
模式,这样就能保证.
运算符能够跨行匹配。
参考链接
- https://deerchao.cn/tutorials/regex/regex.htm
- https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions
- https://deerchao.cn/tools/wegester/
标题:正则表达式
作者:LeonYew
日期:2025-08-17