正则表达式
本文最后更新于 2024年7月26日 晚上
什么是正则表达式
正则表达式是一组由字母和符号组成的特殊文本,是一种用于匹配和操作文本的强大工具,它可以在文本中查找、替换、提取你想要的文字,也可以用来验证特定的字符组成模式。一个正则表达式一般从左到右匹配主体字符串,常使用缩写的术语“regex”或“regexp”。
工具和基本语法
正则表达式一般以\<regex>\<flag>
的形式存在,不同软件可能存在差异。<regex>
就是我们需要输入的匹配规则,而<flag>
则用于标记匹配模式。
<flag>
总共有:
g
: 全局匹配i
: 忽略大小写m
: 多行匹配s
: 单行匹配y
: 贪婪模式,匹配尽可能多的字符
⚠️⚠️⚠️
<flag>
标记在不同版本的正则表达式中的差距可能很大,具体请参考正则表达式版本
测试工具
正则表达式测试工具:
RegExr: Learn, Build, & Test RegEx
基本规则
我们利用<regex>
来进行文本匹配
at
: 匹配文本中的at字符at.
: 匹配文本中at加除换行符外的任意一个字符,.
表示匹配除换行符外的任意一个字符[]
: 表示字符集合,[et]
表示匹配e或t,at[et]
,表示匹配at后跟一个e或一个t的字符,相当于匹配ate或att。- 方框内的字符还可以用短横线连接表示一个字符范围,如
[a-zA-Z]
表示匹配所有大小写字母 - 方框内还可以使用
^
号来表示取反,如[^a-z]
表示匹配除了小写字母外的所有字符
- 方框内的字符还可以用短横线连接表示一个字符范围,如
❗❗❗ 方框内的^
号才表示取反,方框外的不表示取反
预定字符类
\d
: 表示数字,和[0-9]
的作用一致。\D
: 表示非数字\w
: 表示字母,数字或下划线\W
: 表示非字母,数字或下划线\s
: 表示空白字符,如空格,Tab\S
: 表示非空白字符,非空格,Tab
位置和边界匹配
-
^
: 匹配每一行的开头,如^a
表示匹配以a开头的每一行 -
$
: 匹配每一行的结尾,如^b
表示匹配以b结尾的每一行 -
\b
: 表示单词的边界,如\bin
表示匹配以in开头的字符,而in\b
则表示匹配以in结尾的字符 -
\B
: 表示非单词边界的匹配
量词
+
: 表示字符重复一次或多次,如at+
表示at中t重复一次或多次,会匹配at, att, attt等
*
: 表示字符重复0次或多次
?
: 表示字符重复0次或一次
{}
: 指定的重复次数,如{3}
表示重复3次,{3,5}
表示重复3到5次,{3,}
表示至少重复3次,如果只想匹配重复3次的字符串,可以用{3,}?
来表示非贪婪模式
分组和引用
- 使用
()
来就创建分组,如(at){3,}?
表示匹配at整体重复3次的字符串 - 使用
()
创建的分组可以用$
+数字来进行捕获,比如$1
表示捕获第一个分组的内容 - 在匹配字符前加
?:
表示非捕获分组,这一部分不能被捕获,如(?:\d{1,2})
表示匹配一到两个数字但不捕获它
如果我们想匹配单词的开头和结尾都是相同字母的字符串,可以用\b([a-z])[a-z]*\1\b
来进行匹配,其中\1
表示引用前面的第一个分组内容([a-z])
前瞻后顾
示例内容:
1 |
|
- 正向前瞻:仅匹配数字前的$,
\$(?=\d+)
- 负向前瞻:仅匹配非数字前的$,
\$(?!\d+)
- 正向后顾:仅匹配$后面的数字,
(?<=\$)\d+
- 负向后顾:仅匹配非$后面的数字,
(?<!\$)\d+
正则表达式版本
- POSIX基本 BRE
- POSIX拓展 ERE
- Perl兼容正则表达式 PCRE
- Python, Javascript等
不同版本的正则表达式兼容情况不一样,并非所有特性都支持,如果出现匹配不到的情况,也许并非写的正则表达式不正确,而是版本不支持,详细支持情况请参考官方文档
- re — Regular expression operations — Python 3.12.4 documentation
- BRE vs ERE (sed, a stream editor) (gnu.org)
- 正则表达式的不同风格:BRE、ERE、PCRE - 吴奇灵的博客 (wqlblog.cn)