正则表达式(RegEx)快速入门到进阶
Last Update:
Word Count:
Read Time:
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] |
匹配 a 、b 或 c 中的任意一个。 |
[aeiou] 匹配所有元音字母。 |
[^abc] |
否定字符组,匹配除了 a 、b 、c 之外的任意一个字符。 |
[^0-9] 匹配所有非数字字符。 |
[a-z] |
范围,匹配从 a 到 z 的任意一个小写字母。 |
[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)
使用圆括号 ()
可以创建一个分组。分组有两个主要作用:
- 作为一个整体进行量化:
(ab)+
会匹配ab
、abab
、ababab
等。 - 捕获内容:匹配到的内容会被捕获到一个编号的组中,可以被后续引用。组的编号从 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,}
: 顶级域名,至少两个字母。$
: 字符串结束。
数据提取:抓取网页中的链接
假设我们有以下 HTML 代码:<a href="https://example.com">Example 1</a>
<a href="http://test.org">Test 2</a>
1 |
|
<a\s+href="
: 匹配<a>
标签的href
属性。([^"]+)
: 捕获href
属性的值(即 URL)。[^"]+
匹配一个或多个非双引号的字符。
日志分析:筛选特定错误信息
假设日志格式为 [YYYY-MM-DD HH:MM:SS] [LEVEL] Message
。
1 |
|
要只匹配 ERROR 级别的日志:
1 |
|
^\[...\]
: 匹配时间戳部分。注意[
需要转义。\[ERROR\]
: 精确匹配[ERROR]
。.*
: 匹配该行剩余的任意内容。$
: 匹配行尾。
实用工具与资源
学习正则表达式最好的方法就是不断练习。以下是一些非常有用的在线工具和资源:
- Regex101: 一个功能强大的在线正则表达式测试、调试和学习网站。它会详细分析你的表达式,并提供实时匹配高亮。
- RegExr: 另一个优秀的在线正则表达式测试工具,界面友好,提供丰富的社区模式库。
- MDN Web Docs (Mozilla): 如果你在 JavaScript 中使用正则表达式,MDN 提供了详尽的文档和教程。
- Python
re
module documentation: Python 官方文档是学习 Python 中正则用法的权威指南。
希望这篇教程能帮助你开启正则表达式的学习之旅!记住,熟能生巧,多加练习,你很快就能运用自如。