正则表达式(RegEx)快速入门到进阶

First Post:

Last Update:

Word Count:
2.3k

Read Time:
8 min

Page View: loading...

写在前面

正则表达式(Regular Expression,简称 Regex)是计算机科学中一个强大的工具,它使用一种专门的语法来查找、匹配和操作字符串中的模式。这是最最基础而且常用的模式匹配的工具啦~

最优的解决办法是先将请求询问大语言模型然后,万一,它错了,那请再根据自己的知识,去修改生成的模式匹配,那就效率max啦!

注意注意再注意:正则匹配式也会随着版本的变化而变化,所以,实践出真知。


快速入门

什么是正则表达式?

想象一下,你需要在文档中查找所有电话号码,但电话号码的格式多种多样,如 010-12345678(010)12345678 或是 13812345678。手动查找无疑是低效且易出错的。正则表达式就是一种描述这种“模式”的语言,你可以构建一个单一的表达式来匹配所有这些格式。

简而言之,正则表达式是定义搜索模式的字符串

基本匹配

最简单的正则表达式就是普通字符。例如,正则表达式 cat 会在字符串 “The cat sat on the mat.” 中精确匹配到 “cat”。

元字符 (Metacharacters)

元字符是正则表达式中具有特殊含义的字符,它们是构建复杂模式的基石。

元字符 名称 描述 示例 匹配
. 匹配除换行符 \n 之外的任意单个字符。 c.t cat, cot, c@t
\d 数字 匹配任意一个数字 (等同于 [0-9])。 \d\d 12, 99
\D 非数字 匹配任意一个非数字字符 (等同于 [^0-9])。 \D\D ab, !@
\w 单词字符 匹配任意一个字母、数字或下划线 (等同于 [a-zA-Z0-9_])。 \w\w\w cat, _12, A_b
\W 非单词字符 匹配任意一个非字母、数字或下划线的字符。 \W @, !, (空格)
\s 空白字符 匹配任意一个空白字符,包括空格、制表符、换行符等。 cat\s cat
\S 非空白字符 匹配任意一个非空白字符。 \S+ hello
^ 脱字符 匹配字符串的开始位置。 ^The The cat
$$` 美元符 匹配字符串的结束位置。 `end$$ the end
\b 单词边界 匹配单词的开始或结束位置。 \bcat\b the cat sat
\B 非单词边界 匹配非单词边界。 \Bcat\B pushcatkin

字符组 (Character Sets)

用方括号 [] 可以创建一个字符组,它会匹配方括号中包含的任意一个字符。

表达式 描述 示例
[abc] 匹配 abc 中的任意一个。 [aeiou] 匹配所有元音字母。
[^abc] 否定字符组,匹配除了 abc 之外的任意一个字符。 [^0-9] 匹配所有非数字字符。
[a-z] 范围,匹配从 az 的任意一个小写字母。 [0-9a-fA-F] 匹配一个十六进制数。

量词 (Quantifiers)

量词用于指定一个模式需要出现的次数。

量词 描述 示例 匹配
* 匹配前一个元素零次或多次。 ca*t ct, cat, caaat
+ 匹配前一个元素一次或多次。 ca+t cat, caaat
? 匹配前一个元素零次或一次。 colou?r color, colour
{n} 匹配前一个元素恰好 n 次。 \d{3} 123
{n,} 匹配前一个元素至少 n 次。 \d{2,} 12, 123, 1234
{n,m} 匹配前一个元素至少 n 次,至多 m 次。 \w{3,5} abc, abcd, abcde

贪婪与非贪婪匹配

默认情况下,量词是贪婪的 (Greedy),意味着它们会尽可能多地匹配字符。

  • 示例:对于字符串 "<div>hello</div>",表达式 <div>.*</div> 会匹配整个字符串。

在量词后面加上一个问号 ? 可以将其变为非贪婪 (Non-greedy) 或懒惰 (Lazy) 模式,它会尽可能少地匹配字符。

  • 示例:对于相同字符串,表达式 <div>.*?</div> 只会匹配到 <div>hello</div>

进阶指南

分组与捕获 (Grouping and Capturing)

使用圆括号 () 可以创建一个分组。分组有两个主要作用:

  1. 作为一个整体进行量化(ab)+ 会匹配 abababababab 等。
  2. 捕获内容:匹配到的内容会被捕获到一个编号的组中,可以被后续引用。组的编号从 1 开始,从左到右依次递增。

非捕获组 (?:...)

有时你只需要分组的功能而不需要捕获内容,此时可以使用非捕获组 (?:...),这样可以提高性能,并且不占用组的编号。

  • 示例(?:https?://)?(www\.\w+\.\w+)
    • (?:https?://): 匹配 http://https://,但不捕获它。
    • (www\.\w+\.\w+): 捕获网站域名,如 www.example.com

断言 (Assertions) - 环视/零宽断言

断言(也称环视或零宽断言)是一种特殊的结构,它只匹配一个位置,而不消耗任何字符。它就像一个条件,要求当前位置的前面或后面必须满足某种模式,但这个模式本身不会成为匹配结果的一部分。

类型 表达式 描述 示例
正向先行断言 (?=...) 要求当前位置的右侧必须能匹配...的模式。 Windows (?=NT|XP) 匹配"Windows",但仅当其后是"NT"或"XP"时。
负向先行断言 (?!...) 要求当前位置的右侧不能匹配...的模式。 Windows (?!NT|XP) 匹配"Windows",但仅当其后不是"NT"或"XP"时。
正向后行断言 (?<=...) 要求当前位置的左侧必须能匹配...的模式。 (?<=USD)\d+ 匹配数字,但仅当其前面是"USD"时。
负向后行断言 (?<!...) 要求当前位置的左侧不能匹配...的模式。 (?<!USD)\d+ 匹配数字,但仅当其前面不是"USD"时。

注意:部分语言或引擎对后行断言的支持不完整。

反向引用 (Backreferences)

反向引用允许你在正则表达式的后面部分引用前面捕获到的分组。通常使用 \1, \2, \3 等来引用第一个、第二个、第三个捕获组。

  • 示例:查找重复的单词
    • 表达式:\b(\w+)\s+\1\b
    • \b(\w+)\b: 匹配并捕获一个单词。
    • \s+: 匹配一个或多个空白符。
    • \1: 引用第一个捕获组(即前面捕获的单词)。
    • 这个表达式可以匹配 “hello hello” 或 “go go”。

模式修饰符 (Modifiers)

模式修饰符可以改变正则表达式的默认行为。它们通常放在整个表达式的末尾(例如 /.../i)或在表达式内部(例如 (?i))。

修饰符 名称 描述
i 忽略大小写 (Case-Insensitive) 使匹配不区分大小写。
g 全局匹配 (Global) 查找所有匹配项,而不是在找到第一个后就停止。
m 多行模式 (Multiline) 使 ^$ 能够匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。

常用场景实战

表单验证:校验邮箱地址

1
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • ^: 字符串开始。
  • [a-zA-Z0-9._%+-]+: 用户名部分,包含字母、数字和一些特殊字符。
  • @: 分隔符。
  • [a-zA-Z0-9.-]+: 域名部分。
  • \.: 匹配点 .
  • [a-zA-Z]{2,}: 顶级域名,至少两个字母。
  • $: 字符串结束。

数据提取:抓取网页中的链接

假设我们有以下 HTML 代码:
<a href="https://example.com">Example 1</a>
<a href="http://test.org">Test 2</a>

1
<a\s+href="([^"]+)"
  • <a\s+href=": 匹配 <a> 标签的 href 属性。
  • ([^"]+): 捕获 href 属性的值(即 URL)。[^"]+ 匹配一个或多个非双引号的字符。

日志分析:筛选特定错误信息

假设日志格式为 [YYYY-MM-DD HH:MM:SS] [LEVEL] Message

1
2
3
[2025-08-06 01:42:00] [INFO] User logged in.
[2025-08-06 01:43:15] [ERROR] Database connection failed.
[2025-08-06 01:44:00] [DEBUG] Processing request.

要只匹配 ERROR 级别的日志:

1
^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] \[ERROR\] .*$
  • ^\[...\]: 匹配时间戳部分。注意 [ 需要转义。
  • \[ERROR\]: 精确匹配 [ERROR]
  • .*: 匹配该行剩余的任意内容。
  • $: 匹配行尾。

实用工具与资源

学习正则表达式最好的方法就是不断练习。以下是一些非常有用的在线工具和资源:

  • Regex101: 一个功能强大的在线正则表达式测试、调试和学习网站。它会详细分析你的表达式,并提供实时匹配高亮。
  • RegExr: 另一个优秀的在线正则表达式测试工具,界面友好,提供丰富的社区模式库。
  • MDN Web Docs (Mozilla): 如果你在 JavaScript 中使用正则表达式,MDN 提供了详尽的文档和教程。
  • Python re module documentation: Python 官方文档是学习 Python 中正则用法的权威指南。

希望这篇教程能帮助你开启正则表达式的学习之旅!记住,熟能生巧,多加练习,你很快就能运用自如。