正规表示

正规表示是一种用于匹配字符串的标准的规范化的模式。 在本产品中,正规表示是通过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"表示的意义为"ABCabc"
可以进行多次的指定。 "ABC|abc|Abc"表示的意义为"ABCabcAbc"

在"(...)"中"(ABC|abc)DEF"表示的意义为"ABCDEFabcDEF"。
若要匹配"ABCDEFabcDEFDEF",可以在括号内指定长度为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} 在相邻字符位置在minmax的范围内重复匹配。
除重复次数不同,和"{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:...)
可以更改已指定模式。
以下模式可供使用。
i
不区分大小写的模式。
在该模式下可匹配不区分大小写的罗马/希腊字符。 未设置(默认状态)的情况下,大小写区分匹配。
s
单行模式。
在该模式下,"
."能够匹配换行符控制码。
在非单行模式(默认状态)下,"."将不能匹配换行符控制码。
以下为换行符的控制码。
U+000A: LINE FEED
U+000C: FORM FEED
U+000D: CARRIAGE RETURN
U+0085: NEXT LINE
U+2028: LINE SEPARATOR
U+2029: PARAGRAPH SEPARATOR
m
多行模式。
在该模式下,"
^"将会从行首(换行符之后)匹配,并且也可以从字符串开始匹配。 "$"将从行尾匹配(换行符之前),并且也可以从字符串结束部分匹配。
当"\A"和"\z"处于多行模式下,并不会改变其操作,将会进行字符串开始匹配以及字符串结尾匹配。 在非多行模式(默认状态)下,"^"将仅仅匹配字符串开始。"$"将仅仅匹配字符串结尾。
以下为换行符的控制码。
U+000A: LINE FEED
U+000C: FORM FEED
U+000D: CARRIAGE RETURN
Combination of U+000D and U+000A
U+0085: NEXT LINE
U+2028: LINE SEPARATOR
U+2029: PARAGRAPH SEPARATOR
x
可以在正规表示中插入空白以及注。在正规表示中,符号"#"之后会被忽略。
例如:"(?x) [A - Z] + # Uppercase characters"和"[A-Z]+"是等价的。
在该模式下,若需要使用空白,"#" 来作为文字使用,请使用"\N{UNICODE CHARACTER NAME}"以及十六进制表达式"\uhhhh"。

可以通过以下的方式来指定。
(?mode)
表示模式的启动。
当模式被执行,知道执行结束,该模式都会被应用到实际的匹配中。
若在分组中使用模式,那么使用范围只能在该分组中。
例子 1: "(?i)WINDOWS OS"
在本例子中,"(?i)"意义为,整个"WINDOWS OS"字符串才是有效的。也就是说,此正规表示将匹配"Windows OS"和"Windows Os"。
例子2: "(UNIX|(?i)WINDOWS) OS"
在本例子中,"(?i)"意义为,整个"WINDOWS"字符串才是有效的。也就是说,此正规表示将匹配"Windows OS",但不会匹配"Windows Os"。
(?-mode)
表示模式解除。
例子: "(?i)WINDOWS(?-i) OS"
在本例子中,"(?i)"意义为,仅字符串"WINDOWS"."有效。
(?:...)
表示模式用于在括号内使用。
例子: "(?i:WINDOWS) OS"
在本例子中,"(?i)"意义为,仅字符串"WINDOWS"."有效。
(?-:...)
表示用于括号内模式的解除。
例子: "(?i)WINDOWS (?-i:OS) IS"
在本例子中,将会匹配"Windows OS is" ",但不会去匹配"Windows Os is"."。


补充说明
元字符
在正规表示中有特殊功能的一个字符(或字符串)称为元字符。相反地,那些非元字符的字符称为文字
正规表示"A.*"将匹配"任意以A开头的字符串",在这里"."以及"*"为元字符,"A"为文字
文字
一个非元字符(或字符串),也就是说没有任何特殊功能的字符称为文字。 通过使用"元字符向文字转换"的方法可以把默认的元字符更改成文字。 例如:若想匹配"任意以.开始的字符串",需要指定"文字."。由于"."是元字符。 所以需要使用"使元字符转换为文字"的元字符"\"来转义,需要写成"\..*"。 另外,"\Q"和"\E"所结合的范围中都作为文字来处理。
单词
在文本编辑器以及文本处理过程中,有"全字匹配"文字检索模式,在正规表示中也有类似的"单词"这种概念存在。 单词是由一系列"构成单词的字符"(单词字符)。 到"非单词字符"出现为止作为一个单词。
"单词字符"可以是"文字,数字",而"非单词字符"可以是空白以及符号。 也就是说在"ABC DEF"中,"ABC"以及"DEF"是单词。
在正规表示中,与单词有关的元字符有"\w"(单词字符) / "\W"(非单词字符) / "\b"(单词边界) / "\B"(非单词边界)。 "单词边界"表示"单词字符和非单词字符相邻的位置","非单词边界"表示非单词边界的位置,也就是说"单词字符之间以及非单词字符相邻的位置"。
例如:若匹配单词"ABC",可以使用"\bABC\b"。虽然字符都是相邻,但是由于单词边界的原因,将匹配"ABC"但不会匹配"ABCDEF"。
在ASCII的范围中,单词字符是"单词,数字以及下划线"。在这范围以外,Unicode中"非修饰字母(不包含"Lm"的字母"L")以及"十进制数字("Nd")"表示为一般类型的文字。 也就是说"\w",和"[_\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}]"意义相同。
请注意,上述的部分不一定能够按照预想的来分类。
文字码
正规表示处理是在Unicode的下执行的。
注意以下的部分。
  • 正规表示中当文字码是十六进制的情况下,需要通过在Unicode(UCS-2)中指定十六进制。
    输入用视表以及输出用视表中,不需要指定十六进制。
    可以指定"
    \uhhhh" "\xhh"和"\x{hhhh}"。
  • 正规表示中若要指定文字的范围,需要通过Unicode(UCS-2),来指定来指定大小的关系。
    输入用视表以及输出用视表中,不需要指定大小关系。
    请参照说明"-"。
  • 符合Unicode 4.0.1标准。
    关于"\N{UNICODE CHARACTER NAME}" / "\p{UNICODE PROPERTY NAME}"来指定"Unicode字符名"以及"Unicode属性名",请参照相关的Unicode 4.0.1的资料。
    在本产品中有关Unicode版本的使用细节,请参照相关的文字码资料。
  • 在Unicode (UCS-2)中最小的匹配单位是一个字符。
    并不是以字节的单位来匹配的。
    实际上软件内部的匹配过程是以Unicode (UTF-16)来做的。所以代理对字符,是在匹配过程中最小的单位的字符,4个字节作为一个字符。 请注意:在其它产品中,代理对字符,是2个字节作为一个字符来处理的。
  • 关于对象字符串 / 正规表示指定的模式字符串 / 置换字符串(模式字符中以匹配字符串置换的字符串),处理时,需要先将其转换为Unicode(Little Endian)。函数的返回值为Unicode(Little Endian)字符串。通常,这些字符串在向输出视表写入时,会被变换为输出视表的文字编码。
    混合文字码规则相比较,需要注意额外的文字码转换
    • 例如:输入用视表使用GB18030而输出用视表为IBM GB HOST,通常情况下GB18030将被转换成IBM GB HOST。 如果在表格栏过滤器中使用了MatchRE函数/ReplaceRE函数,那么GB18030将被转换成Unicode(Little endian)并且Unicode(Little endian)会被转换成IBM GB HOST。
      请注意,1次的文字转换将变成2回的文字转换结果可能会带来结果的改变。在使用扩展字符的时候需要特别注意。
    • 例如:输入用视表以及输出用视表都为IBM GB HOST情况下,通常的情况下将不会进行文字码的转换。 但是,若使用MatchRE函数/ReplaceRE函数,那么IBM GB HOST将被转换为Unicode(Little endian)文字码,并且Unicode(Little endian)将被转换为IBM GB HOST文字码。
      请注意,额外的文字码的变化会导致转换结果的改变。在目标字符串中若使用了控制码,需要特别注意。(若在IBM GB HOST转换成Unicode(Little endian)情况下,那么控制码将被转换成空白)。
分组
用于循环指定的元字符"*"和"+",在分组中被指定为"字符串分组",而不是作为"重复字符"元字符。 分组在"(...)"和"(?:...)"中使用。
例如:"(AB)+"可以匹配"AB,ABAB,ABABAB,..."。 选择范围"|"也是分组的功能之一。
反向引用
在正规表示中,括在"(...)"部分将会被匹配后保存起来,接下来的根据正规表示中的"\num"被称为反向引用。
"\num"中num用于指定第几个"(...)"匹配字符串位置的数字。"(...)"可递归。"("为从左边某位置开始计数的数值。"(?:...)"不对应后方参照,"("也不计数。

类似参照在ReplaceRE函数的置换后的部分字符串的参数中也可进行。在这里,作为后方参照的一种,进行说明。另外,在置换后部分字符串模式中,读写格式为"$num"而不是"?num"。在正规表示的后方参照(?num)中,num的值为1以上,而置换后部分字符串的后方参照($num)中的num的值为0以上。 "$0"不是以"(...)"记忆的字符串,而是参照置换前部分字符串中匹配字符串的全体
正规表示中反向引用(\num)的示例:
"(["']).*\1"可以匹配以""以及''括起来的字符串,例如""ABC""或"'ABC'"。 "["'].*["']"中,若没有使用反向引用,有没有单引号都将会匹配,例如""ABC'"。 若使用了反向引用则只能匹配单引号的部分。
反向引用中使用替换子串($num)的示例:
 ReplaceRE(电话号码,"(0\d{1,3})-(\d{2,4})-(\d\d\d\d)","$1($2)$3")
可以有下列的转换
03-1234-567803(1234)5678
022-123-4567022(123)4567
0238-12-34560238(12)3456
若变换前字符串就已经是"03(1234)5678",那么"(0\d{1,3})-(\d{2,4})-(\d\d\d\d)"的转换将不会执行。
"$num"中的num是各个匹配后的值。
例如:以下表达式是不能做转换的。
 ReplaceRE(日期,"(\d*)","$2/$3/$1",0)
转换
 1999/12/3112/31/1999
在Replace函数的参数"匹配顺序"为0,所以匹配将执行3次。在各个匹配中只有"$1"可以被引用,"$2"和"$3"不能被引用(若被指定,会导致执行结果非正常结束)。若想做这样的转换,可以这样指定
  ReplaceRE(日期,"(\d*)/(\d*)/(\d*)","$2/$3/$1")