简写的字符类——迹忆客-ag捕鱼王app官网
简写字符类
由于经常使用某些字符类,因此可以使用一系列速记字符类。\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*=\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
。