教程 > 正则表达式 > 字符类 阅读:86

简写的字符类

简写字符类


由于经常使用某些字符类,因此可以使用一系列速记字符类。\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 。

查看笔记

扫码一下
查看教程更方便