正则表达式
在线正则表达式网站:https://regexr-cn.com/
注:若无特殊说明,本文章严格区分字符(单个字符)与字符串(多个字符)。
字符串模式匹配
字符串模式匹配:根据模式串(Pattern)的数量,分为单模匹配与多模匹配。设原串 S S S、模式串 T T T, T T T在 S S S中可能多次出现,在 S S S中找所有 T T T的相等串的过程即为单模匹配;设原串 S S S、模式串 { T 1 , ⋯ , T n } \set{T_1,\cdots ,T_n} {T1,⋯,Tn},在 S S S中找到所有 { T 1 , ⋯ , T n } \set{T_1,\cdots ,T_n} {T1,⋯,Tn}的相等串的过程即为多模匹配
正则表达式是通配符(?
、*
)的扩展,常用于字符串的模式匹配。通过修改模式串,可使模式串按照一定规则进行匹配。
匹配符号
若要匹配这些符号本身,则需将其本身转义(\
)。
.
:匹配除\n
外的任意字符(类似于通配符中的?
)。如a.b
匹配acb
,但不匹配ab
和accb
。[ ]
:字符集。匹配字符集中的任意字符。若需匹配的字符间呈连续性(如字典序、数字序列等),中间部分范围可用-
省略。如a[b-dB-D]
可匹配ab
、ac
、ad
、aB
、aC
、aD
。[^ ]
:取反字符集。匹配除该字符集外的任意字符。如a[^a-b]
匹配ac
等,但不匹配aa
、ab
。- 预定义类:
\d
:任意数字,等价于[0-9]
\D
:任意非数字,等价于[^0-9]
\w
:任意字母、数字、下划线\W
:任意非字母、数字、下划线\s
:任意空白字符(Space
、Tab
等)\S
:任意非空白字符
边界匹配
边界匹配符可搭配使用。使用边界匹配符后,默认仅对文本首行进行边界匹配。
^
:匹配仅在行头出现的字符串。如^ab
匹配abcd abbc aabc
中abcd
的ab
,但不匹配abbc
和aabc
。$
:匹配仅在行尾出现的字符串。如ab$
匹配aabb abab cbab
中cbab
中的ab
,但不匹配aabb
和abab
。\b
:匹配仅在词头出现的字符串。如\bab
匹配abcd abaa baba
中abcd
和abaa
的ab
,但不匹配baba
。\b
:匹配仅在词尾出现的字符串。如ab\b
匹配cdab aaab caba
中adab
和aaab
中的ab
,但不匹配caba
。\B
:匹配非词头出现的字符串(位于单词的中间或末尾)。如\Bab
匹配abaa aaba aaab
中aaba
和aaab
中的ab
,但不匹配abaa
。\B
:匹配非词尾出现的字符串(位于单词的开头或中间)。如ab\B
匹配abaa aaba aaab
中abaa
和aaba
中的ab
,但不匹配aaab
。
匹配修饰符
g
:全局匹配,匹配模式串出现的所有位置i
:忽略模式串大小写m
:对所有行都进行边界匹配s
:使.
支持匹配\n
匹配量词及其匹配模式
匹配量词
{<number>}
:匹配其前面的字符出现<number>
次。若表示重复次数区间,则用,
分隔,表示重复次数的闭区间。
若不给定区间端点,由于贪婪匹配机制,不给定的端点默认为 0 0 0(左端点)和 + ∞ +\infty +∞(右端点)。如abt{3}
仅匹配abttt
,abt{3,5}
仅匹配abttt
、abtttt
、abttttt
,abt{3,}
匹配abttt
、abtttt
等。*
:匹配其前面的字符出现 ≥ 0 \ge 0 ≥0次,等价于{0,}
。如abt*
匹配ab
、abt
、abtt
等。+
:匹配其前面的字符出现 ≥ 1 \ge 1 ≥1次,等价于{1,}
。如abt+
匹配abt
、abtt
等,但不匹配ab
。?
:匹配其前面的字符出现 0 0 0或 1 1 1次,等价于{0,1}
。如abt?
匹配ab
、abt
,但不匹配abt
等。
量词的匹配模式
- 贪婪匹配:尽可能多匹配,直到无法再进行匹配为止。量词默认为贪婪匹配。如
abt*
匹配ab
、abt
、abtt
等。 - 非贪婪匹配:尽可能少匹配,一旦满足匹配条件则立即停止匹配。在量词后加
?
(懒惰符)开启非贪婪匹配。如abt*?
仅匹配abt
。
分组 捕获 引用
- 分组:将若干字符组织成一个整体的字符串进行匹配
( )
:非命名捕获分组,分组并捕获(记忆化)该匹配。如(ab)+
则用于字符串ab
出现 ≥ 1 \ge 1 ≥1次,匹配ab
、abab
等。(?: )
:非命名非捕获分组。匹配后不进行捕获。(?P<<tag_name>><regex>)
:命名捕获分组。<tag_name>
为分组名,其被<>
包围;<regex>
为正则表达式内容。- 引用:重复使用先前被分组捕获的内容
- 反向引用:在匹配模式时,当遇到反向引用时,不再继续向后匹配,而是反过来向前引用先前的捕获分组。
反向索引引用:适用于非命名捕获分组,通过形如\<num>
的索引引用访问先前的捕获。
反向命名引用:适用于命名捕获分组,通过形如(?P=<tag_name>)
引用访问先前的捕获。 - 替换引用:在替换时引用。
替换索引引用:适用于非命名捕获分组,通过形如$<num>
的索引引用访问先前的捕获。
替换命名引用:适用与命名捕获分组,通过形如\g<name>
引用访问先前的捕获。
- 反向引用:在匹配模式时,当遇到反向引用时,不再继续向后匹配,而是反过来向前引用先前的捕获分组。
逻辑运算
|
:或。位于两个模式串之间。可用于实现多模匹配。如abc|def
可匹配abc
,也可匹配def
。