正规表示是一种用于匹配字符串的标准的规范化的模式。
在本产品中,正规表示是通过MatchRE 函数和ReplaceRE 函数来实现的。
在正规表示中,使用被称为元字符的功能字符来表示"字符串开始"、"字符重复"。在本产品中元字符的详细资料,请参照正规表达式的元字符。正规表示用于高级的模式匹配,使用正规表示需要一定的技巧。在本文档中会提供一些给出一些简单的描述作为参照。当需要掌握和理解整个正规表式,请参照相关的正规表示的资料。
正规表达式是一个标准概念,在各种类型的文本数据处理工具(sed、awk、Perl)中使用。
在本产品中使用的正规表示与这些工具中使用的是不完全一致的,他是作为一个某种程度上标准的派生。任何已知的正规表示,也可以在其它工具中使用。
元字符 | 注释 |
---|---|
\a | 匹配控制码 BELL (U+0007:BELL)。 |
\A |
字符串开始部分进行匹配。 和"^"不同,"\A" 不能从行首进行匹配(换行符之前的位置)即使在多行模式下也不能进行匹配。 |
\b |
表示一个单词边界。
有关单词边界细节,请参照说明单词。 如果使用"[...]"或者"[^...]",匹配意义将改变。请参照 "[\b]"。 单词边界的意义是"字符间的间隔",不能使用类似的字符"\b*"。不能通过指定重复的元字符来进行匹配。 |
[\b] | 匹配控制码 BS (U+0008:BACKSPACE),当"\b"在"[...]"或"[^...]"中被指定。 |
\B | 匹配非单词边界。 有关单词边界细节,请参照单词的说明。 |
\cX |
匹配通过按CTRL+X指定的控制字符。 指定的X是大写字母或小写都是可以的。 (例外:"\c"中的c应该是小写的字母)。 |
\d |
匹配一个数字字符。 数字匹配。 等价于"[\p{Nd}]"。 |
\D | 匹配一个非数字字符。 |
\e | 匹配控制码ESC (U+001B: ESCAPE)。 |
\E | 可以和"\Q"结合使用。 若字符串("...")写成该表达式"\Q...\E" 则作为"文字"来处理。 |
\f | 匹配一个换页符 FF (U+000C: FORM FEED)。 |
\G | 指定匹配必须出现在上一个匹配结束的地方。 第一次匹配时,和\A是相同的,用来匹配字符串的开头。 例如,对字符串"03-1234-5678",指定"\d\d","03"及"12"可以第一次和第二次分别的来匹配。 相反地,当"\G\d\d""被指定,第一次匹配与上述相同,但不会匹配第二次。 通过指定MatchRE 函数的参数"匹配次数"为2,来第二次匹配抽取的字符串。 |
\n | 匹配一个换行符LF (U+000A: LINE FEED)。 |
\N{UNICODE CHARACTER NAME} |
通过指定的UNICODE CHARACTER NAME来匹配相应的"UNICODE字符名称"。 UNICODE CHARACTER NAME可以是大写或小写字母。 ("\N"中的"N"必须大写)。 有关"Unicode字符名称"详细信息,请参照相关的UNICODE的资料。也可以通过windows的附件来查看字符映射表获取相关信息。 当某一个名称没有在UNICODE CHARACTER NAME,会导致执行结果非正常结束。 |
\p{UNICODE PROPERTY NAME} |
通过指定的UNICODE PROPERTY NAME来匹配"Unicode属性名称"。
"Unicode属性名称"是被用来"指定字符分组"的。 可以简单的通过指定"字符类型"来作为系统该方的分组,不过请注意在匹配中可能会有不可预料的字符。 (Unicode的版本升级,Unicode属性的变更是不兼容的)。为了提高执行的准确性,可以通过"[...]"来分别指定。 接下来介绍一下"Unicode属性名称"。 "Cc" "Ll" "Nd" 等: 是Unicode中较为常用的名称。 (例如,"\p{Nd}"匹配整个十进制数。 "\p{Z}"匹配字符以"Z"开头的一般类别名称。 (在这种情况下,等价于"\p{Zl}\p{Zp}\p{Zs}")) "ASCII": 7位的ASCII码(包含控制码) "LATIN": 罗马字符集 (使用罗马字符包含重音符号) (请注意,"字母"并不意味着"罗马字") "PRIVATE_USE": 用户自定义区域的字符 如果指定了一个在UNICODE PROPERTY NAME中不存在的名称,执行后的结果会发生异常。 UNICODE属性名称可以大写字母或者小写。 ("\p"中的"p"必须是小写)。 |
\P{UNICODE PROPERTY NAME} |
匹配"Unicode属性名称"相当于指定了UNICODE PROPERTY NAME。 UNICODE PROPERTY NAME可以是大写字母或者小写。 ("\P"中的"P"必须是大写)。 |
\Q | 可以和"\E"结合使用。 若字符串("...")写成该表达式"\Q...\E"则作为"文字"来处理。 |
\r | 匹配一个回车符CR (U+000D: CARRIAGE RETURN). |
\s |
匹配任何空白字符。 包括空格、制表符、换页符等等。 等价于"[\t\n\f\r\p{Z}]"。 |
\S |
匹配任何非空白字符。 实际上"\S"匹配的字符并不匹配"\s"。 请注意,"\S"所显示的字符和"\s"所显示的字符是不一样的。 |
\t | 匹配一个制表符HT (U+0009: CHARACTER TABULATION). |
\uhhhh |
匹配用四位16进制(hhhh)表示的Unicode字符(UCS-2)。 十六进制中"ABCDEF" 可以是大写字母或者小写("\u"中的"u"必须小写)。 未满4位的情况下,执行后的结果会发生异常。超过5位的情况下,将截取前4位来处理。 例如,"\u00312"会被解析成两个字符"12","\u0031"和"2"。 通过使用"\xhh"和"\x{hhhh}"可以来指定位数长度。 |
\w | 匹配单词字符。有关单词字符细节,请参照单词。 |
\W | 匹配任何非单词字符。有关单词字符细节,请参照单词。 |
\xhh |
匹配用两位16进制hh表示的字符(UCS-2)。 十六进制中"ABCDEF" 可以是大写字母或者小写("\x"中的"x"必须小写)。 当只有1位的情况下,执行后的结果会发生异常。超过3位的情况下,将截取前2位来处理。 通过使用"\uhhhh"和"\uhhhh"可以来指定位数长度。 |
\x{hhhh} | 匹配十六进制表示的Unicode (UCS-2)字符。 hhhh表示可指定1位至7位的十六进制。 十六进制中"ABCDEF"可以是大写字母或者小写("\x"中的"x"必须小写)。 当指定值超过10FFF的情况下,执行后的结果会发生异常。 在未超过10FFFF的前提下,将不会匹配一个不存在的值。 通过使用"\uhhhhhhh"和"\xhh&qu"可以来匹配位数固定的十六进制。 |
\z | 匹配字符串结尾。 "\z"不同于"$",即使在"多行模式"下也不会匹配行尾(换行符之前的位置)。 |
\Z | 匹配字匹配字符串结尾。 "\Z"不同于"$",即使在"多行模式"下也不会匹配行尾(换行符之前的位置)。 "\Z"不同于"\z",如果字符串中的最后一个字符处于新的一行,那么字符串结尾匹配和行尾匹配是一样的(无论是否是多行模式,结果都是相同的)。 |
\num |
以\1,\2,...的格式,来表示查找"(...)"num的位置。 请参照反向引用来使用该方法。如果值得数据大于"(...)",会导致执行结果非正常结束。 |
[...] |
在"..."中匹配每一个字符。
可以根据"-"来指定范围。 在正规表示的参照资料中称作"字符类"。 像这样的字符匹配"[ABA]"和"[AB]"是等价的。 在 "[...]"中,可以使用控制类型的元字符例如 "-"、"\"、"\n"可以使用十六进制的元字符/"\uhhhh"/"\N{UNICODE CHARACTER NAME}"/"\p{UNICODE PROPERTY NAME}"/"\P{UNICODE PROPERTY NAME}"/"[:POSIX方括号表达式:]"。 这些元字符在"[...]"中可以嵌套使用。 若"-"、"\"、"^"、"$"、"["、"]"、":"、"&" 作为文字来使用的话,可以通过使用"\"来转义,可以写成"\-"、"\\"、"\^"、"\$"、"\["、"\]"、"\:"、"\&"。 |
[^...] |
匹配未包含的任意字符。 在正规表示的参照资料中称作"字符类"。 |
- | 可以在"[...]"和"[^...]"中指定。 例如,ASCII的大写字符匹配可以写成"[A-Z]"。 通过"[开始-结束]"的设定,可以从开始部分匹配到结束部分。 若没有按照上述原则进行设定,会导致执行结果非正常结束。 例如"[A-A]",会导致执行结果非正常结束。当"-"(例如"[-A]"或者"[A-]")在"[...]"或"[^...]"中处于开始部分或者结束部分,会被作为作为文字。 |
[:POSIX括号名:] |
匹配字符所对应的字符组,该字符组也称作"POSIX方括号表达式"。
该方法可以简单的指定"特定类型的字符组"。
和"\p{UNICODE PROPERTY NAME}"是等价的。
以下是"POSIX方括号表达式"的一些介绍。 [:alpha:] 字母字符,不包括数字和符号 [:blank:] 空格与制表符 [:cntrl:] 控制字符 [:digit:] 数字字符 [:graph:] 非空白字符 [:lower:] 小写罗马字符 [:print:] 可显示的字符包含空白字符 [:punct:] 标点符号字符 [:space:] 空白字符与换行符 [:upper:] 罗马大写字符 [:xdigit:] 十六进制数字 此外,在本产品支持中并没有像其它的"POSIX方括号表达式"那样支持"[:alnum:]"。 如果指定了一个POSIX括号名中不存在的字符,会导致执行结果非正常结束。 POSIX括号名可以是大写字母或者小写。 |
[:^POSIX括号名:] | 匹配未包含"POSIX方括号表达式"所对应的字符组。POSIX括号名可以是大写字母或者小写。 |
. | 匹配除任何单个字符。正常情况下是不会去匹配换行符的,但如果在单行模式下,可以匹配。 |
^ |
匹配输入字符串的开始位置。 在多行模式下,会在开始行(换行符之后的位置)之后进行匹配。 若把"^"作为文字来匹配,需要使用"\"来组成"\^"。没有使用"\",并不会导致异常结束,但不会正确的匹配相应的值。 |
$ |
匹配输入字符串结尾的位置。在多行模式下,会在行尾(换行符之前)进行匹配。
然而在非多行模式下,如果字符串中的最后一个字符处于新的一行,那么字符串结尾匹配和行尾匹配是一样的(无论是否是多行模式,结果都是相同的)。
若把"$"作为文字来匹配,需要使用"\"来组成"\$"。
若没有使用"\",并不会导致异常结束,但不会正确匹配相应的值。 在Waha!里面,因为"$"是一个字符代表了变量,当指定的字符常量处理处理时候,要写"$$",这样就代表一个字符常量。 |
\ |
将元字符转换为文字。 在正规表示的参照资料中称作"字符转义"。 除了在"[...]"和"[^...]"以外,若"* ? + [ ] ( ) { } ^ $ | \ . /"作为字符来使用,需要追加"\",写成"\*" "\?"这样的格式。 在"[...]"和"[^...]"中,若一个字符例如"-"被指定为文字,需要写成"\-"。(在"[...]"中需要字符转义,请参照"[...]")。 "\"后没有和任何字符时,会导致执行结果非正常结束。 当非元字符被和"\"一起被指定,"\"将被忽略,作为"H"文字。 |
| |
与以"|"字符分隔的正规表示中的任何一项匹配。 在正规表示的参照资料中称作"替换","ABC|abc"表示的意义为"ABC或abc"。 可以进行多次的指定。 "ABC|abc|Abc"表示的意义为"ABC或abc或Abc"。 在"(...)"中"(ABC|abc)DEF"表示的意义为"ABCDEF或abcDEF"。 若要匹配"ABCDEF或abcDEF或DEF",可以在括号内指定长度为0的字符"(ABC|abc|)DEF"。 当匹配的字符串存在多个设置,在左侧的字符串将被优先匹配。 例如:"ABC|ABCDEF"来匹配字符串"ABCDEF",既可以匹配成"ABC"也可以匹配成"ABCDEF",但是实际上"ABC"在左侧会优先被匹配。 若使用"(ABC|ABCD)EF"来匹配,只能匹配"ABCDEF",和匹配的先后顺序没有关系,在"(ABC|ABCD)"中匹配"ABCD"。 也可以和"*"来组合使用,进行表达式的多次匹配。 例如:"(ABC|abcdef)*GHI"可以匹配"可以匹配"ABCABCGHI"以及"ABCabcdefGHIot"。 |
* |
匹配相邻的字符零次或多次。 在正规表示的参照资料中称作"量词"或者"重复"。 "A*"可以匹配"长度为0的字符串,A,AA,AAA,AAAA以及其它"。 "A.*"代表任意以A开始的字符。"."表示任意单个字符的元字符。 在"(...)"中,可以使用分组字符。 例如:"(AB)*"可以匹配"长度为0的字符串,AB,ABAB,ABABAB以及其它"。 当存在多种匹配情况下,将会匹配左侧开始最长的字符串。 例如:若"A.*B"来匹配"ABCBCB",可以有"ABot;","ABCB"以及"ABCBCBot",多种匹配结果,但实际上只能"匹配最长的字符串"ABCBCBot"。 若"A[AB]*B"来匹配"AAB ABB",可以有"AAB","AB","ABBot; is "的匹配结果。 按照"匹配最左侧"原则,实际上只能匹配"AABot;、wh"。当然也可以通过设置MatchRE 函数的参数"匹配次数"为2,可以第二次匹配字符串,来抽取"ABBot; whi"。 "最左侧字符串"原则优先于"最长匹配"原则。 若一字符串"A123B456789"使用"\d*"来匹配,并且指定了参数"匹配次数"为1,匹配结果为接近"A"的长度为0首次匹配字符串。 "第二次匹配字符串"为"123","第三次匹配字符串"为"456789"。 如果要避免发生"长度为0的字符串"的匹配结果,可以使用使用"+"(重复一次以上)。 若指定为"\d+"那么"第一次匹配字符串"结果为"123"。 若在正规表示开始就指定"*",会导致执行结果非正常结束。 若相邻的元字符是重复意义的元字符,会导致执行结果非正常结束。 为了能够使用重复匹配的功能,需要使用分组。 例如:"(A[0-9]+)*"。如果指定多重的循环,和单独的循环比较,这种匹配的可能的字符串的组合会成基数倍的增长,这样不是一个好的提高性能方法。 若想避免多重循环的话,利用"(?>...)"会减少匹配可能的字符串的组合数。 在Microsoft Excel 以及 Windows shell script中使用的通配符"*"是类似的。 但是请注意两者的意义是不同的。在Shell script中使用的通配符"*"和正规表示".*"是一致的。 |
+ |
在相邻字符位置匹配重复一次以上。 除了重复次数不同以外,和"*"是类似的。 |
? |
在相邻字符位置匹配0次或者一次。 除了重复次数不同以外,和"*"是类似的。 在Microsoft excel 以及 Windows shell script中使用的通配符"?"是类似的,但是请注意两者的意义是不同的。 在shell script中使用的通配符"?"和正规表示的"."是一致的。 |
{num} |
在相邻字符位置重复num次的匹配。 num值的范围大于0小于16777215的数字。 若该值超过了范围会导致执行结果非正常结束。 除了重复次数的不同,和"*"是类似的。 |
{min,} |
在相邻字符位置重复匹配min次以上。 除了重复次数不同,和"{num}"是类似的。 |
{min,max} |
在相邻字符位置在min和max的范围内重复匹配。 除重复次数不同,和"{num}"是类似的。 |
*? | 基本和"*"类似,但"*?"是匹配最左侧最短字符串。 |
+? | 基本和"+"类似,但"+?"是匹配最左侧最短字符串。 |
?? | 基基本和"?"类似,但"??"是匹配最左侧最短字符串。 |
{num}? | 和"{num}"类似。 |
{min,}? | 基本和"{min,}"类似,但"{min,}?"是匹配最左侧最短字符串。 |
{min,max}? | 基本和"{,max}"类似,但"{,max}?"是匹配最左侧最短字符串。 |
*+ |
基本和"*"类似,但是在该表达式中含有有特殊的匹配过程。 "[1-9]*+"和"(?>[1-9]*) "是等价的。 有关的详细信息请参照"(?>...)"。 |
++ |
基本和
"++"类似,但是在该表达式中含有特殊的匹配过程。 "[1-9]++"和"(?>[1-9]+) "是等价的。 有关的详细信息请参照"(?>...)"。 |
?+ |
基本和"?"类似,但是在该表达式中含有特殊的匹配过程。 "[1-9]?+"和"(?>[1-9]?)"是等价的。 有关的详细信息请参照"(?>...)"。 |
{num}+ |
基本和"{num}". "(A|B){2}+"和"(?>(A|B){2})"以及"(A|B){2}"是等价的。 |
{min,}+ |
基本和
"{min,}"类似,但是在该表达式中含有特殊的匹配过程。 "[1-9]{0,}+"和"(?>[1-9]{0,}"是等价的。 有关的详细信息请参照"(?>...)"。 |
{min,max}+ |
基本和
"{min,max}"类似,但是在该表达式中含有特殊的匹配过程。 "[1-9]{0,1}+"和"(?>[1-9]{0,1})是等价的。 有关详细信息请参照"(?>...)"。 |
(...) | 可以在括号中使用分组。 用于保存后向引用匹配后的字符串。 |
(?:...) | 基本和"(...)"类似,但只能在分组中使用,并不支持后向引用。 |
(?>...) | 基本和"(?:...)"类似。 在正规表示的参照资料中称作"原子分组"。 例如:对字符串"ABCD"进行"[A-Z]+D"匹配,表达式中"[A-Z]+"部分,由于"最左侧最长字符串"原则,将匹配成"ABCD"。 表达式中紧随其后的"D",最终的匹配结果为"ABCD"。 上述例子中,"[A-Z]+"部分的匹配结果为"ABC",并没有按照"最长字符串"原则。 若使用"(?>[A-Z]+)D"正规表示,那么将会按照"最左侧最长字符串"原则来进行匹配,其匹配结果为"ABCD"。根据该结果,正规表示"D"可以忽略,所以可以认为表达式"(?>[A-Z]+)D"不会匹配任何的字符串。"(?>...)"以及"(?:...)"会得到不同结果,是因为在表达式"(?>...)"内使用了多组的正规表示,如"...*","...|..."以及在"(?>...)"后追加正规表示"(?>...)..."。当符合上述条件时,表达式"(?:[A-Z]+)[0-9]+"中,由于"[A-Z]+"与"[0-9]+"并没有同时匹配相同的文字,所以可以同表达式"(?>[A-Z]+)[0-9]+"可以得到相同的结果。一般而言,使用"(?>...)"时,由于匹配的字符串组合数受到了限制,所以可以告诉匹配。若以高速运行为目的,使用上述的"(?>...)"时,请注意匹配结果可能会发生变化。 |
(?#...) |
作为注释。 在运行过程中"(?#...)"被作为注释来处理,会被忽略执行。 |
(?=...) |
使用正规表示"(?=...)"来进行匹配时,当字符串匹配时,返回的并非匹配的字符串本身,而是匹配字符串的先头部分。例如:当知道"xxx(?=yyy)"时,如果xxx后存在yyy,则相应字符串被匹配。 在正规表示的参照资料中称作"环视结构"。 例如:字符串"ABCD Hotel"进行".*(?= Hotel)"匹配,匹配结果为"ABCD"。 若要在字符串中"Hotel ABCD"中匹配"ABCD",需要使用"(?<=...)"组成表达式"(?<=Hotel ).*"来进行匹配。 |
(?!...) | 使用"(?!...)"正规表示进行匹配时,当字符串不匹配时,返回不匹配的字符串的先头部分。例如,当指定"约翰(?!特)"时,"约翰"被匹配,而"约翰特"里的"约翰"不被匹配。 |
(?<=...) | 使用"(?<!...)"正规表示进行匹配时,当字符串不匹配时,返回不匹配字符串的尾部。"..."部分可读写的反复指定符与"(?<=...)"相同。"(?<=yyy)xxx"与"(?=...)"相反,当xxx之前有字符串yyy时匹配。另外,"..."部分可读写的反复指定符只能指定为"?" / "?+" / "{num}" / "{min,max}"。(对于正规表示"(?=...)"无此限制") |
(?<!...) | 使用"(?<!...)"正规表示进行匹配时,当字符串不匹配时,返回不匹配字符串的尾部。"..."部分可读写的反复指定符与"(?<=...)"相同。 |
(?mode) (?-mode) (?mode:...) (?-mode:...) |
可以更改已指定模式。 以下模式可供使用。
可以通过以下的方式来指定。
|