简写的字符类
简写字符类
由于经常使用某些字符类,因此可以使用一系列速记字符类。\d
是[0-9]
的缩写。在大多数支持Unicode的版本中,\d
包括所有脚本中的所有数字。值得注意的是,除了Java,JavaScript和PCRE。这些Unicode样式仅将\d
与ASCII数字匹配。
\w
代表“文字字符”。它始终与ASCII字符[A-Za-z0-9_]
匹配。请注意包含下划线和数字。在大多数支持Unicode的版本中,\w
包含许多其他脚本中的字符。关于实际包含哪些字符有很多不一致之处。通常包括字母脚本和表意文字的字母和数字。除下划线和非数字符号之外的连接器标点符号可能会包含在内,也可能不包含。XML Schema和XPath甚至包括\w
中的所有符号。同样,Java,JavaScript和PCRE 仅将ASCII字符与\w
匹配。
\s
代表“空白字符”。同样,这实际上包括哪些字符,取决于正则表达式的风格。在本教程中讨论的所有形式中,它都包含[\t\r\n\f]
。也就是说:\s
匹配空格,制表符,回车符,换行符或换页符。大多数语言还包括“垂直”标签,Perl(版本5.18之前)和PCRE(版本8.34之前)是明显的例外。在支持Unicode的版本中,\s
通常包括Unicode“分隔符”类别中的所有字符。Java和PCRE再次是例外。但是JavaScript确实将所有Unicode空格都与\s匹配。
速记字符类可以在方括号的内部和外部使用。\s\d
匹配一个空格字符,后跟一个数字。[\s\d]
匹配一个空格或数字的单个字符。当应用于1 + 2 = 3时,前者正则表达式匹配2 (2后跟着一个空格),而后者则匹配1(一个1)。[\da-fA-F]
匹配一个十六进制数字,并且如果我们只匹配\d
的ASCII字符,则它等效于[0-9a-fA-F]
。
否定的速记字符类
以上三个速记也有否定的版本。\D
与[^\d]
相同,\W
是[^\w]
的缩写,\S
是[^\s]
的等价物。
在方括号内使用取反的速记符时要小心。[\D\S]
和[^\d\s]
是不一样的。后者匹配既不是数字也不是空格的任何字符。它匹配x,但不匹配8。但是,前者与不是数字或不是空格的任何字符匹配。因为所有数字都不是空格,并且所有空格字符都不是数字,所以[\D\S]
可以匹配任何字符;数字,空格或其他。
更多简写字符类
尽管对\d
,\s
和\w
的支持非常普遍,但是有些正则表达式却支持其他速记字符类。Perl 5.10引入了\h
和\v
。\h
匹配水平空格,其中包括制表符和“空格分隔符” Unicode类别中的所有字符。它与[\t\p{Zs}]
相同。\v
匹配“垂直空格”,其中包括在Unicode标准中被视为换行符的所有字符。它与[\n\cK\f\r\x5\x{2028}\x{2029}]
相同。
从7.2版开始,PCRE还支持\h
和\v
。PHP从5.2.2版本开始运行,Java从8版本开始运行,而JGsoft引擎从2版本开始运行。
如果我们的正则表达式引擎支持\h
和\v
,那么当我们只想匹配一种类型的空格时,绝对应该使用它们而不是\s
。使用\h
代替\s
来匹配空格和制表符,确保我们的正则表达式匹配不会意外溢出到下一行。
在许多其他正则表达式中,\v
仅匹配垂直制表符。Perl,PCRE和PHP从来都不支持此功能,因此他们可以随意给\v
赋予不同的含义。Java 4至7和JGsoft V1确实使用\v
来仅匹配垂直制表符。无论如何,Java 8和JGsoft V2更改了此令牌的含义。垂直制表符也是垂直空格字符。为避免混淆,以上段落使用\cK表示垂直制表符。
Boost从版本1.42开始支持\h
。Boost 1.42和更高版本仅在字符类之外才支持\v作为速记。[\v]
仅与Boost中的垂直选项卡匹配。
Ruby 1.9和更高版本具有自己的\h
版本。就像[0-9a-fA-F]
一样,它匹配一个十六进制数字。\v
是Ruby中的垂直标签。
XML字符类
XML Schema,XPath和JGsoft V2正则表达式支持另外四个正则表达式,而其他任何正则表达式类型均不支持。\i
匹配可能是XML名称的第一个字符的任何字符。\c
匹配XML名称中第一个字符之后可能出现的任何字符。\I和\C分别是取反的简写。请注意,\c速记语法与许多其他正则表达式中使用的控制字符语法冲突。
我们可以使用括号符号在字符类的内部和外部使用这四个速记。它们对于验证XML模式中的XML引用和值非常有用。正则表达式\i\c*
与XML名称相匹配,例如xml:schema 。
正则表达式<\i\c*\s*>
与没有任何属性的开头XML标记匹配。</\i\c*\s*>
与任何结束标记匹配。<\i\c*(\s+\i\c*\s*=\s*(“[^”]*“|'[^']*'))*\s*>
将开头标记与任何属性总数。<(\i\c*(\s+\i\c*\s*=\s*(“[^”]*“|'[^']*'))*|/\i\c*)\s*>
匹配具有属性的开始标记或结束标记。
本教程中讨论的其他正则表达式类型均不支持XML字符类。如果我们的XML文件是纯ASCII码,则可以将[_:A-Za-z]
用于\i
,并将[-._A-Za-z0-9]
用于\c
。如果要允许XML标准允许的所有Unicode字符,那么我们将得到一些相当长的正则表达式。我们必须使用
[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]
来代替\i
,使用
[-.0-9A-Z_a-z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]
而不是\c
。