|
|
|
| 『菲菲更名宝贝』帮助——正则表达式 |
|
| 作者:国良 文章来源:http://www.ffhome.com 点击数: 更新时间:2007-6-23 16:39:25 | 【字体:小 大】 |
|
目录
1.基本语法 (1)普通字符 (2)简单的转义字符 (3)转义字符(\Q...\E) (4)字符集合 (5)自定义字符集合 (6)匹配次数限定符 (7)字符边界 (8)选择表达式 (9)分组 (10)命名分组 (11)反向引用 2.扩展语法 (1)注释 (2)模式修改符 (3)非捕获分组 (4)预搜索(零宽度断言) (5)独立表达式 (6)条件表达式 (7)递归表达式 3.匹配模式 (1)忽略大小写(IGNORECASE) (2)单行模式(SINGLELINE) (3)多行模式(MULTILINE) (4)全局模式(GLOBAL) (5)从右向左模式(RIGHTTOLEFT) (6)扩展模式(EXTENDED) 4.替换 (1)$number (2)${name} (3)$$ (4)$& (5)$` (6)$' (7)$+ (8)$_
1.基本语法
1.1 普通字符
字母、数字、汉字、下划线,以及没有被定义特殊意义的标点符号,都是 "普通字符"。
说明
"普通字符" 在匹配时,匹配与之相同的一个字符。
如果一个表达式中,所有的字符都是 "普通字符",那么这个表达式的匹配操作,实际上就是一个普通的 "字符串查找" 操作。 |
1.2 简单的转义字符
一些不便书写的字符,比如换行符,制表符等,使用 \n,\t 来表示。另外有一些标点符号在正则表达式中,被定义了特殊的意义,因此需要在前面加 "\" 进行转义后,匹配该字符本身。
说明
本软件正则表达式中的转义字符:
| 转义符 |
说明 |
| \a |
响铃符 = \x07 |
| \f |
换页符 = \x0C |
| \n |
换行符 = \x0A |
| \r |
回车符 = \x0D |
| \t |
制表符 = \x09 |
| \v |
垂直制表符 = \x0B |
| \e |
ESC 符 = \x1B |
| \x20 |
使用两位十六进制表示形式,可与该编号的字符匹配 |
| \u002B |
使用四位十六进制表示形式,可与该编号的字符匹配 |
| \x{20A060} |
使用任意位十六进制表示形式,可与该编号的字符匹配 |
在本软件正则表达式中被定义了特殊的意义,因而需要在前面添加 "\" 来匹配该字符本身的标点符号:
| 字符 |
说明 |
| ^ |
匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^" |
| $ |
匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$" |
| ( ) |
标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)" |
| [ ] |
用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]" |
| { } |
修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}" |
| . |
匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\." |
| ? |
修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?" |
| + |
修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+" |
| * |
修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*" |
| | |
左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|" | |
1.3 转义字符 \Q...\E
使用 \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.4 字符集合
可以匹配 "多个字符" 其中任意一个字符的正则表达式。虽然是 "多个字符",但每次只能匹配其中一个。
说明
本软件正则表达式中标准的字符集合有:
| 字符集合 |
说明 |
| . |
小数点可以匹配除了换行符(\n)以外的任意一个字符 |
| \w |
可以匹配任何一个字母或者数字或者下划线 |
| \W |
W大写,可以匹配任何一个字母或者数字或者下划线以外的字符 |
| \s |
可以匹配空格、制表符、换页符等空白字符的其中任意一个 |
| \S |
S大写,可以匹配任何一个空白字符以外的字符 |
| \d |
可以匹配任何一个 0~9 数字字符 |
| \D |
D大写,可以匹配任何一个非数字字符 |
| [:alpha:] |
POSIX 格式,可以匹配任何一个字母 |
| [:^alpha:] |
POSIX 否定格式,可以匹配任何一个字母以外的字符 |
如果正则表达式匹配模式为 SINGLELINE,小数点可以匹配包含换行符在内的任一字符。更多详情,参见正则表达式匹配模式。
本软件正则表达式支持的 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:] 类似 ,当 [: 之后为 ^ 时,表示相应字符集合之外的字符。 |
1.5 自定义字符集合 [ ]
用中括号 [ ] 包含多个字符,可以匹配所包含的字符中的任意一个。同样,每次只能匹配其中一个。
用中括号 [^ ] 包含多个字符,构成否定格式,可以匹配所包含的字符之外的任意一个字符。
说明
正则表达式中的特殊符号,如果被包含于中括号中,则失去特殊意义,但 \ [ ] : ^ - 除外。
标准字符集合,除小数点(.)外,如果被包含于中括号中,自定义字符集合将包含该集合。 比如:[\d.\-+],将可以匹配数字,小数点和 + - 符号。(小数点和 + 号失去特殊意义)
用减号相连的 2 个普通字符,自定义字符集合将包含该范围。 比如:[\dA-Fa-f],将可以匹配 0 - 9, A - F, a - f。
自定义字符集合可以包含 POSIX 字符集合。
不管正则表达式匹配模式是否是 IGNORECASE,字符集合在匹配时,都是要区分大小写的。更多详情,参见正则表达式匹配模式。 |
1.6 匹配次数限定符
使被修饰的表达式可多次重复匹配的修饰符。
说明
可使被修饰的表达式重复固定次数,也可以限定一定的重复匹配的次数范围。
在限定符之后的表达式能够匹配成功的情况下,不定次数的限定符总是尽可能的多匹配。如果之后的表达式匹配失败,限定符可适当“让出”能够匹配的字符,以使整个表达式匹配成功。这种模式就叫“贪婪模式”。
| 限定符 |
说明 |
| {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.7 字符边界
本身不匹配任何字符,只对字符边界和字符间缝隙附加条件的表达式。
说明
有些正则表达式中的符号,可以对文本中当前所在位置作限制条件:
| 边界条件 |
说明 |
| ^ |
当前位置必须是文本开始位置 |
| $ |
当前位置必须是文本结束位置 |
| \b |
当前位置的左右两侧,只能有一侧是字母数字或下划线 |
如果正则表达式的匹配模式为 MULTILINE 模式,^ 可匹配一行文本的行首,$ 可匹配一行文本的行末。更多详情,参见正则表达式匹配模式。
当 \b 被包含于字符集合中时,\b 代表退格符(ASCII码 = 8)。 |
1.8 选择表达式 xxx | xxx
使用竖线 "|" 分隔多段表达式,整个表达式可匹配其中任意一段。
说明
正则引擎总是从左向右进行尝试匹配,如果每一段表达式都匹配失败,则整个表达式匹配失败。 |
1.9 分组 ( )
用括号 ( ) 将其他表达式包含,可以使被包含的表达式组成一个整体,在被修饰匹配次数时,可作为整体被修饰。
另外,用括号包含的表达式,所匹配到的内容将单独作记录,匹配过程中或结束后可以被获取。
说明
每一对括号会分配一个编号,使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。 |
1.10 命名分组 (?<name>xxx)
与普通分组一样的功能,并且将匹配的子字符串捕获到一个组名称或编号名称中。
在获得匹配结果时,可通过分组名进行获取。
说明
命名捕获根据左括号的从左到右的顺序按顺序编号(与非命名捕获类似),但在对所有非命名捕获进行计数之后才开始对命名捕获进行编号。
本软件正则表达式允许多个命名分组的名字相同,这时它们捕获到的内容会放在同一个分组编号下。在逻辑上,它们是同一个分组。
如果两个命名相同分组之间有包含关系,那么被包含的那个分组将不进行捕获。 |
1.11 反向引用 \nnn
对指定分组已捕获的字符串进行引用,要求文本中当前位置开始的字符串,必须和指定分组捕获到的字符串一致。
说明
本软件正则表达式支持的反向引用格式:
| 反向引用 |
说明 |
| \nnn |
对指定编号的分组进行反向引用 |
| \g<name> |
对指定名字的命名分组进行反向引用 |
| \k<name> |
| \k'name' |
另外,如果被引用的捕获组(括号对)未进行捕获时,则该反向引用将匹配失败。
本软件正则表达式最多将 3 位数字识别为反向引用,如果想在表达式中表示 \1 外加一个字符 2 ,那么应该写成 \0012。在 DEELX 中,不管是否有第 12 对括号,写成 \12 都表示对第 12 对括号的引用。
本软件正则表达式不将 \nnn 格式识别为 8 进制数,参见简单的转义字符。 |
2.扩展语法
2.1 注释 (?#xxx)
格式 (?# xxx ) 可用来表示一段注释。
说明
注释可以位于表达式中任意地方,但不可以出现在转义字符(\)与被转移字符中间。比如:\(?# xxx )w 是不可以的,这样写的效果实际上是第一个括号被转义成普通字符了。
在 (?# 之后,遇到第一个反括号将表示注释结束。因此,想把注释写成 (?# x()xx ) 或者 (?# x\)xx ) 都是不可以的。注释中的反斜杠(\),不代表转义字符。 |
2.2 模式修改符 (?ismg-ismg)
在正则表达式中间,对匹配模式进行修改。
说明
关于匹配模式,请参见匹配模式。
本软件正则表达式支持对 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) |
反向预搜索否定,判断当前位置左侧是否部能够匹配指定表达式 |
在本软件正则表达式中,不管整个表达式是“普通模式”还是“从右向左”模式,正向预搜索内部的表达式,始终采用“普通模式(从左向右)”模式,反向预搜索内部的表达式,始终采用“从右向左”模式。
“正向预搜索”在各个引擎中的表现基本一致。
关于“反向预搜索”中包含的表达式,Perl, Java, GRETA 以及本软件正则表达式的细节都不相同:
| 引擎 |
说明 |
举例 |
| Perl |
只能使用固定长度的反向预搜索。 |
(?<=\t)print |
| Java |
允许使用不定长度的反向预搜索,但必须要有最大长度。 |
(?<=\{\s{0,100})print |
| GRETA |
允许使用没有长度限制,但否定格式存在一些问题。 |
(?<=\{\s*)print |
本软件正则表达式中的反向预搜索:
本软件正则表达式采用 RIGHTTOLEFT 模式来匹配“反向预搜索”中的表达式。使反向预搜索与正向预搜索在逻辑上完全相同,而方向相反。因此,在本软件正则表达式中,反向预搜索与正向预搜索一样,没有长度限制。
比如,在本软件正则表达式引擎中:
| 文本 |
表达式 |
匹配结果 |
|
{print} |
(?<!\{\s*)print |
匹配失败 |
| (?<=\{\s*)print |
匹配成功 | |
2.5 独立表达式 (?>pattern)
独立表达式所匹配的内容,与将它单独匹配时匹配的内容一致。不管之后的表达式是否匹配成功,独立表达式内部都不进行回退,都不会再次尝试匹配。
说明
相比之下,如果 pattern 不是位于独立表达式中,当后边的表达式匹配失败时,pattern 所包含的不定次数的表达式(?, +, {n,m}, ……)会尝试改变匹配次数,选择表达式(比如:a|b)也会尝试匹配另一个选项,再次进行匹配,以尽量使整个表达式能够匹配成功。 |
2.6 条件表达式
根据某个条件是否成立,来选择匹配 2 个可选表达式中的其中一个。
说明
可以用于条件表达式的条件有两种类型:
- 指定分组(group)是否进行了捕获。
- 文本中当前位置是否可以与指定表达式匹配。
条件表达式的格式及说明:
| 表达式 |
条件特点 |
条件说明 |
| (?(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)) |
本软件正则表达式支持的递归表达式格式有:
| 格式 |
说明 |
| (?R) |
对整个表达式的递归引用。 |
| (?R1),(?R2) |
对指定分组的递归引用。 |
| (?1),(?2) |
| (?R<named>) |
对指定命名分组的递归引用。 |
| (?R'named') | |
3.匹配模式
本软件正则表达式匹配模式
本软件正则表达式支持的匹配模式有:IgnoreCase, Singleline, Multiline, Global, RightToLeft, Extended 这 6 种模式以及它们的组合。
说明
IGNORECASE
匹配时忽略大小写。默认情况下,正则表达式是要区分大小写的。不管是否指定忽略大小写模式,字符类,比如 [A-Z] 是要区分大小写的。
SINGLELINE
使小数点 "." 可以匹配包含换行符(\n)在内的任意字符。默认情况下,小数点只匹配换行符以外的任意字符,不匹配换行符。
MULTILINE
使 ^ 符号除了能够匹配字符串开始位置外,还能匹配换行符(\n)之后的位置;使 $ 符号除了能够匹配字符串结束位置外,还能匹配换行符之前的位置。默认情况下, ^ 符号只能匹配字符串开始位置, $ 符号只能匹配字符串结束位置。
SINGLELINE 和 MULTILINE 虽然听起来相互矛盾,但却是作用在不同的地方。因此它们是可以组合使用的。
在指定了 MULTILINE 之后,如果需要仅匹配字符串开始和结束位置,可以使用 \A 和 \Z。
GLOBAL
使 \G 可以用来匹配本次查找匹配的开始位置,对于连续的匹配来说,也就是上次匹配的结束位置。默认情况下, \G 没有作用。
本软件正则表达式在进行替换操作(Replace)时,不管是否指定 GLOBAL 模式,本软件正则表达式都可以进行所有的替换。是否指定 GLOBAL 模式只是对 \G 起作用。如果希望进行有限次数的替换,可在替换操作时指定替换次数。
RIGHTTOLEFT
从右向左的进行匹配。从被匹配字符串的结束位置向前进行查找匹配,同时,在表达式中也是右侧的表达式先进行匹配。
表达式的写法仍然按原来的习惯:匹配次数修饰符(*, +, {n}, ……)仍然位于被修饰部分的右侧而不是左侧;^ 仍然匹配文本开始而不是文本结束;(?=xxx) 仍然是正向与搜索(向右预搜索),而不是向左;分组(group)编号仍然是从左向右进行编号;等等。
不管整个表达式是否指定了 RightToLeft 模式,"反向预搜索(反向零宽度断言)" 内的表达式始终采用 RightToLeft 模式。
EXTENDED
使本软件正则表达式忽略表达式中的空白字符,并且把从 # 开始到该行行末的内容视为注释。默认情况下,正则表达式中的空格,换行等字符将可以匹配相应的字符。指定了 EXTENDED 模式后,如果要在正则表达式中表示空白字符比如空格符号(space)时,应该用 \x20 表示,如果要在表达式中表示 # 符号,应该用 \# 表示。
不管是否指定了 EXTENDED 模式,括号内以 ?# 号开始时,比如(?# xxx ),那么这一对括号以及包含的内容都始终作为注释而被忽略。 |
4.替换
Replace 替换操作
对匹配到的字符串进行替换操作。
说明
$1 ~ $999
代表某个捕获组捕获到的内容。如果捕获组编号大于表达式中的最大捕获组编号,那么本软件正则表达式会减少数字个数,以使捕获组编号小于或等于最大编号;而把剩余的数字看作字符串常量。
举例:
当前最大捕获组编号为 20,那么,指定替换为 "$999" 将被看作 "$9" + "99";指定替换为 "$15" 将代表第 15 个捕获组。如果本来就是想把 "5" 当成字符串常量时("$1" + "5"),可以使用 $0015 表示,本软件正则表达式最多识别 3 位 10 进制数字。
${name}
代表指定命名分组捕获到的内容。
$$
表示一个 $ 符号。
$&
代表每次匹配到内容。
$`
代表原字符串中,匹配到的内容之前的字符串。$` 中`符号就是键盘左上角"~"下边的那个符号。
$'
代表原字符串中,匹配到的内容之后的字符串。$' 中 ' 符号就是单引号。
$+
代表所有“有捕获”的分组中,编号最大的那个分组。
举例:"aaa(b+)|ccc(b+)" 在匹配 "aaabbb" 时,虽然最大分组是第2个分组,但最大“有捕获”的是第1个分组,此时的 $+ 代表 $1 。
$_
代表被替换的整个字符串。"_" 是下划线。 |
|
|
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
|
|