教程 > 正则表达式 > 阅读:91

简写的字符类——迹忆客-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 。

查看笔记

扫码一下
查看教程更方便
网站地图