正则表达式

首先,正则表达式的语法不是很重要。在 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 模式,这样就能保证 . 运算符能够跨行匹配。

参考链接


标题:正则表达式
作者:LeonYew
日期:2025-08-17