正则表达式
在线正则表达式网站: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。
