NotePad++ 正则表达式替换 高级用法 [转]:https://www.cnblogs.com/tibit/p/6387199.html
正则表达式完成替换功能(NotePad++和SourceInsight):https://blog.csdn.net/helaisun/article/details/81021518
实用正则表达式匹配和替换:https://www.cnblogs.com/DreamRecorder/p/8966642.html
正则表达式工具Match Tracer:http://www.regexlab.com/zh/mtracer/
0 前言
在编写处理文件的程序时,经常会有查找复合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为“元字符”)组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
DEELX 是一个在 C++ 环境下的与 Perl 兼容的正则表达式引擎。是 RegExLab 开展的一个研究开发项目。DEELX 支持 Perl 兼容的正则表达式语法。DEELX 支持的正则表达式语法与大多数正则引擎基本相同。在扩展语法部分,DEELX 实现了一些独到的功能。
1 基本语法
1.1 普通字符
字母、数字、汉字、下划线,以及没有被定义特殊意义的标点符号,都是 “普通字符”。“普通字符” 在匹配时,匹配与之相同的一个字符。如果一个表达式中,所有的字符都是 “普通字符”,那么这个表达式的匹配操作,实际上就是一个普通的 “字符串查找” 操作。
字母:abcdefghijkl mn opqrstuvwxyz,ABCDEFGHIJKL MN OPQRSTUVWXYZ
数字:0123456789
汉字:星,空
下划线:_
没有被定义特殊意义的标点符号
中文标点符号:
英文标点符号:
键盘中文符号:·~ !? @#¥% …… &+-*/= —— ()【】{}《》 、| ;: ‘’ “” ,。
键盘英文符号:`~ !? @#$% ^ &+-/*= _ ()[]{}<> \| ;: '' "" ,.
1.2 转义字符
一些不便书写的字符,比如换行符,制表符等,使用\n,\t
来表示。另外有一些标点符号在正则表达式中,被定义了特殊的意义,因此需要在前面加"\"
进行转义后,匹配该字符本身。
DEELX 中的转义字符:
\a # 响铃符 = \x07
\f # 换页符 = \x0C
\n # 换行符 = \x0A
\r # 回车符 = \x0D
\t # 制表符 = \x09
\v # 垂直制表符 = \x0B
\e # ESC 符 = \x1B
\x20 # 使用两位十六进制表示形式,可与该编号的字符匹配
\u002B # 使用四位十六进制表示形式,可与该编号的字符匹配
\x{20A060} # 使用任意位十六进制表示形式,可与该编号的字符匹配
在 DEELX 中被定义了特殊的意义,因而需要在前面添加 "\" 来匹配该字符本身的标点符号:
^ # 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"
$ # 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"
( ) # 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"
[ ] # 用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"
{ } # 修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"
. # 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."
? # 修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"
+ # 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"
* # 修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"
| # 左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"
使用 \Q 开始,\E 结束,可使中间的标点符号失去特殊意义,将中间的字符作为普通字符。
使用 \U 开始,\E 结束,除了具有 \Q…\E 相同的功能外,还将中间的小写字母转换成大写。在大小写敏感模式下,只能与大写文本匹配。
使用 \L 开始,\E 结束,除了具有 \Q…\E 相同的功能外,还将中间的大写字母转换成小写。在大小写敏感模式下,只能与小写文本匹配。
\Q…\E 适合用于:表达式中需要比较长的普通文本,而其中包含了特殊符号。如:
表达式 说明
\Q(a+b)*3\E # 可匹配文本 "(a+b)*3"。
\(a\+b\)\*3 # 如果不使用 \Q...\E 进行转义,则对每个特殊符号进行转义。
1.3 字符集合
字符集合
可以匹配 “多个字符” 其中任意一个字符的正则表达式。虽然是 “多个字符”,但每次只能匹配其中一个。
DEELX 正则表达式中标准的字符集合有:
. # 小数点可以匹配除了换行符(\n)以外的任意一个字符
\w # 可以匹配任何一个字母或者数字或者下划线
\W # W大写,可以匹配任何一个字母或者数字或者下划线以外的字符
\s # 可以匹配空格、制表符、换页符等空白字符的其中任意一个
\S # S大写,可以匹配任何一个空白字符以外的字符
\d # 可以匹配任何一个 0~9 数字字符
\D # D大写,可以匹配任何一个非数字字符
[:alpha:] # POSIX 格式,可以匹配任何一个字母
[:^alpha:] # POSIX 否定格式,可以匹配任何一个字母以外的字符
如果正则表达式匹配模式为 SINGLELINE,小数点可以匹配包含换行符在内的任一字符。
DEELX 支持的 POSIX 字符集合定义有:
POSIX 字符集合 说明
[:alnum:] # 任何一个字母或数字(A - Z, a - z, 0 - 9)
[:alpha:] # 任何一个字母(A - Z, a - z)
[:ascii:] # 任何一个 ASCII 范围内字符(\x00 – \x7F)
[:cntrl:] # 任何一个控制字符(\x00 – \x1F, \x7F)
[:digit:] # 任何一个数字(0 – 9)
[:print:] # 任何一个可显示的 ASCII 字符(\x20 – \x7E)
[:space:] # 任何一个空白字符(\x09 – \x0D, \x20)
[:graph:] # 任何一个可显示的 ASCII 字符,不包含空格(\x21 – \x7E)
[:lower:] # 任何一个小写字母(a – z)
[:punct:] # 可显示字符 [:print:] 中除去字母数字 [:alnum:]
[:upper:] # 任何一个大写字母(A – Z)
[:xdigit:] # 任何一个十六进制数字(0 - 9, A - F, a - f)
[:blank:] # 空格或者制表符(\x20, \x09)
所有的 POSIX 字符集合,与 [:^alpha:] 类似 ,当 [: 之后为 ^ 时,表示相应字符集合之外的字符。
自定义字符集合 [ ]
用中括号[ ]
包含多个字符,可以匹配所包含的字符中的任意一个。同样,每次只能匹配其中一个。
用中括号[^ ]
包含多个字符,构成否定格式,可以匹配所包含的字符之外的任意一个字符。
正则表达式中的特殊符号,如果被包含于中括号中,则失去特殊意义,但\ [ ] : ^ -
除外。
标准字符集合,除小数点(.)
外,如果被包含于中括号中,自定义字符集合将包含该集合。比如:[\d.\-+]
,将可以匹配数字
,小数点
和+ - 符号
。(小数点和 + 号失去特殊意义)
用减号相连的 2 个普通字符,自定义字符集合将包含该范围。比如:[\dA-Fa-f]
,将可以匹配0 - 9
,A - F
,a - f
。
自定义字符集合可以包含 POSIX 字符集合。
不管正则表达式匹配模式是否是 IGNORECASE,字符集合在匹配时,都是要区分大小写的。
1.4 匹配次数限定符
使被修饰的表达式可多次重复匹配的修饰符。
可使被修饰的表达式重复固定次数,也可以限定一定的重复匹配的次数范围。在限定符之后的表达式能够匹配成功的情况下,不定次数的限定符总是尽可能的多匹配。如果之后的表达式匹配失败,限定符可适当“让出”能够匹配的字符,以使整个表达式匹配成功。这种模式就叫“贪婪模式”。
限定符 说明
{n} # 表达式固定重复n次,比如:"\w{2}" 相当于 "\w\w"
{m,n} # 表达式尽可能重复n次,至少重复m次:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"
{m, } # 表达式尽可能的多匹配,至少重复m次:"\w\d{2,}"可以匹配 "a12","x456"...
? # 表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}
+ # 表达式尽可能的多匹配,至少匹配1次,相当于 {1, }
* # 表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }
“勉强模式”限定符:在限定符之后添加问号(?),则使限定符成为“勉强模式”。勉强模式的限定符,总是尽可能少的匹配。如果之后的表达式匹配失败,勉强模式也可以尽可能少的再匹配一些,以使整个表达式匹配成功。
限定符 说明
{m, n}? # 表达式尽量只匹配m次,最多重复n次。
{m, }? # 表达式尽量只匹配m次,最多可以匹配任意次。
?? # 表达式尽量不匹配,最多匹配1次,相当于 {0, 1}?
+? # 表达式尽量只匹配1次,最多可匹配任意次,相当于 {1, }?
*? # 表达式尽量不匹配,最多可匹配任意次,相当于 {0, }?
“占有模式”限定符:在限定符之后添加加号(+),则使限定符成为“占有模式”。占有模式的限定符,总是尽可能多的匹配。与“贪婪模式”不同的是,即使之后的表达式匹配失败,“占有模式”也不会“让出”自己能够匹配的字符。
限定符 说明
{m, n}+ # 表达式尽可能重复n次,至少重复m次。
{m, }+ # 表达式尽可能的多匹配,至少重复m次。
?+ # 表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}+
++ # 表达式尽可能的多匹配,至少匹配1次,相当于 {1, }+
*+ # 表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }+
1.5 字符边界
本身不匹配任何字符,只对字符边界和字符间缝隙附加条件的表达式。
有些正则表达式中的符号,可以对文本中当前所在位置作限制条件:
边界条件 说明
^ # 当前位置必须是文本开始位置
$ # 当前位置必须是文本结束位置
\b # 当前位置的左右两侧,只能有一侧是字母数字或下划线
如果正则表达式的匹配模式为 MULTILINE 模式,^ 可匹配一行文本的行首,$ 可匹配一行文本的行末。当 \b 被包含于字符集合中时,\b 代表退格符(ASCII码 = 8)。
1.6 选择表达式 xxx | xxx
使用竖线 “|” 分隔多段表达式,整个表达式可匹配其中任意一段。
正则引擎总是从左向右进行尝试匹配,如果每一段表达式都匹配失败,则整个表达式匹配失败。
1.7 分组 ( )
用括号 ( ) 将其他表达式包含,可以使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。
另外,用括号包含的表达式,所匹配到的内容将单独作记录,匹配过程中或结束后可以被获取。
每一对括号会分配一个编号,使用 ( ) 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。
1.8 命名分组 (?<name>xxx)
与普通分组一样的功能,并且将匹配的子字符串捕获到一个组名称或编号名称中。
在获得匹配结果时,可通过分组名进行获取。
命名捕获根据左括号的从左到右的顺序按顺序编号(与非命名捕获类似),但在对所有非命名捕获进行计数之后才开始对命名捕获进行编号。
DEELX 允许多个命名分组的名字相同,这时它们捕获到的内容会放在同一个分组编号下。在逻辑上,它们是同一个分组。
如果两个命名相同分组之间有包含关系,那么被包含的那个分组将不进行捕获。
1.9 反向引用 \nnn
对指定分组已捕获的字符串进行引用,要求文本中当前位置开始的字符串,必须和指定分组捕获到的字符串一致。
DEELX 支持的反向引用格式:
反向引用 说明
\nnn # 对指定编号的分组进行反向引用
\g<name> # 对指定名字的命名分组进行反向引用
\k<name>
\k'name'
另外,如果被引用的捕获组(括号对)未进行捕获时,则该反向引用将匹配失败。
DEELX 最多将 3 位数字识别为反向引用,如果想在表达式中表示 \1 外加一个字符 2 ,那么应该写成 \0012。在 DEELX 中,不管是否有第 12 对括号,写成 \12 都表示对第 12 对括号的引用。
DEELX 不将 \nnn 格式识别为 8 进制数,参见简单的转义字符。
2 扩展语法
2.1 注释 (?#xxx)
格式 (?# xxx ) 可用来表示一段注释。
注释可以位于表达式中任意地方,但不可以出现在转义字符(\)
与被转移字符中间。比如:\(?# xxx )w
是不可以的,这样写的效果实际上是第一个括号被转义成普通字符了。
在 (?#
之后,遇到第一个反括号将表示注释结束。因此,想把注释写成 (?# x()xx )
或者 (?# x\)xx )
都是不可以的。注释中的反斜杠(\)
,不代表转义字符。
2.2 模式修改符 (?ismg-ismg)
在正则表达式中间,对匹配模式进行修改。
关于匹配模式,请参见匹配模式。
DEELX 支持对 IGNORECASE, SINGLELINE, MULITLINE, GLOBAL 进行修改。
修改后的匹配模式,只对当前小括号内,修改符之后的部分起作用。比如:
表达式 说明
a(b(?i)c)d # 增加 i - IGNORECASE 模式,只对 c 起作用。表达式可以匹配 "abcd" 和 "abCd"
2.3 非捕获组 (?:xxx)
使用 (?: )
包含其他表达式,可使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。
与普通分组不同的是,非捕获组不记录所匹配的内容,比普通分组更节约内存资源。
通过格式 (?ismg-ismg:xxx)
可对匹配模式进行修改,修改后的模式只对当前非捕获组内部起作用。
2.4 预搜索(令宽度断言)
判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。
预搜索有向前和向后两种:
表达式 方向 说明
(?=xxx) # 正向预搜索(向右) # 正向预搜索,判断当前位置右侧是否能匹配指定表达式
(?!xxx) # 正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式
(?<=xxx) # 反向预搜索(向左) # 反向预搜索,判断当前位置左侧是否能够匹配指定表达式
(?<!xxx) # 反向预搜索否定,判断当前位置左侧是否不能够匹配指定表达式
在 DEELX 中,不管整个表达式是“普通模式”还是“从右向左”模式,正向预搜索内部的表达式,始终采用“普通模式(从左向右)”模式,反向预搜索内部的表达式,始终采用“从右向左”模式。
“正向预搜索”在各个引擎中的表现基本一致。
关于“反向预搜索”中包含的表达式,Perl, Java, GRETA 以及 DEELX 的细节都不相同:
引擎 说明 举例
Perl # 只能使用固定长度的反向预搜索。 # (?<=\t)print
Java # 允许使用不定长度的反向预搜索,但必须要有最大长度。 # (?<=\{\s{0,100})print
GRETA # 允许使用没有长度限制,但否定格式存在一些问题。 # (?<=\{\s*)print
DEELX 中的反向预搜索:
DEELX 采用 RIGHTTOLEFT 模式来匹配“反向预搜索”中的表达式。使反向预搜索与正向预搜索在逻辑上完全相同,而方向相反。因此,在 DEELX 中,反向预搜索与正向预搜索一样,没有长度限制。
比如,在 DEELX 引擎中:
文本 表达式 匹配结果
{print} (?<!\{\s*)print 匹配失败
(?<=\{\s*)print 匹配成功
2.5 独立表达式 (?>pattern)
独立表达式所匹配的内容,与将它单独匹配时匹配的内容一致。不管之后的表达式是否匹配成功,独立表达式内部都不进行回退,都不会再次尝试匹配。
相比之下,如果 pattern 不是位于独立表达式中,当后边的表达式匹配失败时,pattern 所包含的不定次数的表达式(?, +, {n,m}, ……)
会尝试改变匹配次数,选择表达式(比如:a|b
)也会尝试匹配另一个选项,再次进行匹配,以尽量使整个表达式能够匹配成功。
2.6 条件表达式
根据某个条件是否成立,来选择匹配 2 个可选表达式中的其中一个。
可以用于条件表达式的条件有两种类型:
1、指定分组(group)是否进行了捕获。
2、文本中当前位置是否可以与指定表达式匹配。
条件表达式的格式及说明:
表达式 条件特点 条件说明
(?(1)yes|no) # 条件为数字 # 分组1如果有捕获,则进行 yes 部分匹配,否则 no 部分
(?(?=a)aa|bbb) # 条件为预搜索 # 如果当前位置右侧是 a,则进行匹配 aa,否则匹配 bbb
(?(xxx)aa|bbb) # 不与分组命名吻合 # 如果不与任何分组命名吻合,则视为 (?=xxx) 相同
(?(name)yes|no) # 与分组命名吻合 # 如果与某分组命名吻合,则视为判断该分组是否进行捕获
另外:
- 如果表达式为 RIGHTTOLEFT 模式,那么 (?(xxx)aa|bbb) 与 (?(?<=xxx)aa|bbb) 相同。
- 如果条件表达式只有一个选择项,那么这个选项是在条件成立时进行匹配。
- 如果条件表达式中,使用“|”进行分隔的选项多于2个,则只有第一个“|”被视为条件表达式选项分隔符。比如: (?(?=xxx)yes|no1|no2),条件成立时,匹配 yes 部分,否则匹配 “no1|no2”。
2.7 递归表达式 (?R)
对另一部分子表达式的引用,而不是对其匹配结果的引用。当被引用的表达式包含自身,则形成递归引用。
相对于 “反向引用” 来说,反向引用是在匹配过程中,对匹配到的字符串内容进行引用,而 “递归匹配” 是对表达式进行引用。举例说明:
表达式 等效的表达式1 等效的表达式2 可以匹配
(\w)(?1) (\w)(\w) ab
(?1)(\w(?2))(\d) (?1)(\w(\d))(\d) (\w(\d))(\w(\d))(\d) a1b23
如果被引用的表达式又包含自身,则形成了递归引用。举例说明:
表达式 等效1 等效2 可以匹配
(\w(?1)?) (\w(\w(?1)?)?) (\w+) ghjk5……
\(([^()]|(?R))*\) \(([^()]|\(([^()]|(?R))*\))*\) (a * (c + 2))
DEELX 支持的递归表达式格式有:
格式 说明
(?R) 对整个表达式的递归引用。
(?R1),(?R2) 对指定分组的递归引用。
(?1),(?2)
(?R<named>) 对指定命名分组的递归引用。
(?R'named')
3 匹配模式
DEELX 匹配模式
DEELX 支持的匹配模式有:IgnoreCase, Singleline, Multiline, Global, RightToLeft, Extended 这 6 种模式以及它们的组合。
忽略大小写(IGNORECASE)
匹配时忽略大小写。默认情况下,正则表达式是要区分大小写的。不管是否指定忽略大小写模式,字符类,比如 [A-Z] 是要区分大小写的。
单行模式(SINGLELINE)
使小数点 “.” 可以匹配包含换行符(\n)在内的任意字符。默认情况下,小数点只匹配换行符以外的任意字符,不匹配换行符。
多行模式(MULTILINE)
使 ^ 符号除了能够匹配字符串开始位置外,还能匹配换行符(\n)之后的位置;使 $ 符号除了能够匹配字符串结束位置外,还能匹配换行符之前的位置。默认情况下, ^ 符号只能匹配字符串开始位置, $ 符号只能匹配字符串结束位置。
SINGLELINE 和 MULTILINE 虽然听起来相互矛盾,但却是作用在不同的地方。因此它们是可以组合使用的。
在指定了 MULTILINE 之后,如果需要仅匹配字符串开始和结束位置,可以使用 \A 和 \Z。
全局模式(GLOBAL)
使 \G 可以用来匹配本次查找匹配的开始位置,对于连续的匹配来说,也就是上次匹配的结束位置。默认情况下, \G 没有作用。
DEELX 在进行替换操作(Replace)时,不管是否指定 GLOBAL 模式,DEELX 都可以进行所有的替换。是否指定 GLOBAL 模式只是对 \G 起作用。如果希望进行有限次数的替换,可在替换操作时指定替换次数。
从右向左模式(RIGHTTOLEFT)
从右向左的进行匹配。从被匹配字符串的结束位置向前进行查找匹配,同时,在表达式中也是右侧的表达式先进行匹配。
表达式的写法仍然按原来的习惯:匹配次数修饰符(*, +, {n}, ……)
仍然位于被修饰部分的右侧而不是左侧;^
仍然匹配文本开始而不是文本结束;(?=xxx)
仍然是正向与搜索(向右预搜索),而不是向左;分组(group)编号仍然是从左向右进行编号;等等。
不管整个表达式是否指定了 RightToLeft 模式,“反向预搜索(反向零宽度断言)” 内的表达式始终采用 RightToLeft 模式。
扩展模式(EXTENDED)
使 DEELX 忽略表达式中的空白字符,并且把从 #
开始到该行行末的内容视为注释。默认情况下,正则表达式中的空格,换行等字符将可以匹配相应的字符。指定了 EXTENDED 模式后,如果要在正则表达式中表示空白字符比如空格符号(space)时,应该用 \x20
表示,如果要在表达式中表示 #
符号,应该用 \#
表示。
不管是否指定了 EXTENDED 模式,括号内以 ?#
号开始时,比如(?# xxx )
,那么这一对括号以及包含的内容都始终作为注释而被忽略。
4 替换语法
Replace 替换操作
对匹配到的字符串进行替换操作。
$number ${name} $$ $&
$` $' $+ $_
$1 ~ $999
代表某个捕获组捕获到的内容。如果捕获组编号大于表达式中的最大捕获组编号,那么 DEELX 会减少数字个数,以使捕获组编号小于或等于最大编号;而把剩余的数字看作字符串常量。
举例:当前最大捕获组编号为 20,那么,指定替换为 “$999” 将被看作 “$9” + “99”;指定替换为 “$15” 将代表第 15 个捕获组。如果本来就是想把 “5” 当成字符串常量时("$1" + “5”),可以使用 $0015 表示,DEELX 最多识别 3 位 10 进制数字。
${name}
代表指定命名分组捕获到的内容。
$$
表示一个 $ 符号。
$&
代表每次匹配到内容。
$`
代表原字符串中,匹配到的内容之前的字符串。$` 中`符号就是键盘左上角"~"下边的那个符号。
$'
代表原字符串中,匹配到的内容之后的字符串。$’ 中 ’ 符号就是单引号。
$+
代表所有“有捕获”的分组中,编号最大的那个分组。
举例:“aaa(b+)|ccc(b+)” 在匹配 “aaabbb” 时,虽然最大分组是第2个分组,但最大“有捕获”的是第1个分组,此时的 $+ 代表 $1 。
$_
代表被替换的整个字符串。"_" 是下划线。
元字符
元字符主要有四种作用:有的用来匹配字符,有的用来匹配位置,有的用来匹配数量,有的用来匹配模式。
转义元字符
\d # 匹配数字
\D # 匹配任意非数字的字符
\w # 匹配字母、数字、下划线或汉字
\W # 匹配任意不是字母、数字、下划线、汉字的字符,如空白符、标点符号(中,英)等
\s # 匹配任意空白符,包括空格、制表符(Tab)、换行符、中文全角空格等
\S # 匹配任意不是空白符的字符
\b # 匹配单词的边界(开头和结尾),‘\bW\w+’匹配以大写字母W开头的单词
\B # 匹配不是单词开头或结尾的位置,‘\Be\B’匹配位于单词中间的字母‘e’
特殊元字符
. # 匹配除换行符之外的任意字符
^ # 匹配字符串的开头,也即匹配一行的开头(行头)
$ # 匹配字符串的结尾,也即匹配一行的结尾(行尾)
(...) # 匹配一个标签区域。这个标签是可以被访问的,通过‘\1’访问第一个标签,‘\2’访问第二个,同理有\3,\4,...,\9
字符集合
[...] # 表示一个字符集合,如[abc]匹配“abc”中的任意一个字符,[.?!]匹配“.?!”中的任意一个标点符号
[^...] # 表示一个字符集合的补集,如[^A-Za-z]表示由除了字母表之外的任意字符组合成的集合
重复限定符
* # 重复 0 次或更多次,如 Sa*m 匹配 Sm,Sam,Saam,Saaam 等字符串
+ # 重复 1 次或更多次,如 Sa+m 匹配 Sam,Saam,Saaam等字符串
? # 重复 0 次或 1 次,如 Sa?m 匹配 Sm,Sam
{n} # 重复 n 次,如 Sa{2}m 匹配 Saam
{n,} # 重复 n 次或更多次,如 Sa{2,}m 匹配 Saam,Saaam 等字符串
{n,m} # 重复 n 到 m 次,如 Sa{2,4}m 匹配 Saam,Saaam,Saaaam
标计和分组
一个分组就是使用小括号指定的一个表达式。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
以简单的IP匹配表达式((\d{1,3})\.){3}\d{1,3}
为例,表达式里有两组小括号,所以有两个分组1和2