快速入门
教程
工具和语言
示例
参考
书评
正则表达式教程
简介
目录
特殊字符
不可打印字符
正则表达式引擎内部
字符类
字符类减法
字符类交集
简写字符类
锚点
单词边界
交替
可选项
重复
分组和捕获
反向引用
反向引用,第 2 部分
命名组
相对反向引用
分支重置组
自由间距和注释
Unicode
模式修饰符
原子分组
占有量词
前瞻和后顾
环视,第 2 部分
将文本排除在匹配之外
条件
平衡组
递归
子例程
无限递归
递归和量词
递归和捕获
递归和反向引用
递归和回溯
POSIX 方括号表达式
零长度匹配
继续匹配
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 提要和博客
RegexBuddy—Better than a regular expression tutorial!

简写字符类

由于某些字符类经常使用,因此提供了一系列简写字符类。 \d[0-9] 的缩写。在大多数支持 Unicode 的版本中,\d 包括所有脚本中的所有数字。值得注意的例外是 JavaJavaScriptPCRE。这些 Unicode 版本仅使用 \d 匹配 ASCII 数字。

\w 表示“单词字符”。它始终匹配 ASCII 字符 [A-Za-z0-9_]。请注意下划线和数字的包含。在支持 Unicode 的大多数风格中,\w 包括来自其他脚本的许多字符。关于实际包含哪些字符存在很多不一致之处。一般包括字母表脚本和表意文字的字母和数字。下划线以外的连接标点符号和非数字的数字符号可能包含或不包含。 XML 架构XPath 甚至包括 \w 中的所有符号。同样,JavaJavaScriptPCRE 仅使用 \w 匹配 ASCII 字符。

\s 表示“空白字符”。同样,这实际包含哪些字符取决于正则表达式风格。在本教程中讨论的所有风格中,它包括 [ \t\r\n\f]。也就是说:\s 匹配空格、制表符、回车符、换行符或换页符。大多数风格还包括垂直制表符,其中 Perl(5.18 版之前)和 PCRE(8.34 版之前)是值得注意的例外。在支持 Unicode 的风格中,\s 通常包括 Unicode“分隔符”类别中的所有字符。 JavaPCRE 再次成为例外。但是 JavaScript 确实使用 \s 匹配所有 Unicode 空白。

简写字符类可以在方括号内和方括号外使用。 \s\d 匹配一个空白字符后跟一个数字。 [\s\d] 匹配一个既是空白又是数字的单个字符。当应用于 1 + 2 = 3 时,前一个正则表达式匹配  2(空格二),而后一个正则表达式匹配 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\x85\x{2028}\x{2029}] 相同。

PCRE 从 7.2 版开始也支持 \h\vPHP 从 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 comunque 改变了此令牌的含义。垂直制表符也是一个垂直空白字符。为了避免混淆,上文使用 \cK 来表示垂直制表符。

Boost 从 1.42 版开始支持 \h。Boost 1.42 及更高版本支持 \v,但仅在字符类之外作为速记。 [\v] 在 Boost 中只匹配垂直制表符。

Ruby 1.9 及更高版本有自己的 \h 版本。它匹配单个十六进制数字,就像 [0-9a-fA-F] 一样。 \v 在 Ruby 中是垂直制表符。

XML 字符类

XML SchemaXPathJGsoft V2 正则表达式支持其他四个速记,而其他任何正则表达式风格都不支持。 \i 匹配可以作为 XML 名称第一个字符的任何字符。 \c 匹配可以在 XML 名称的第一个字符后出现的任何字符。 \I\C 分别是取反的速记。请注意,\c 速记语法与许多其他正则表达式风格中使用的 控制字符 语法冲突。

你可以在字符类内和字符类外使用方括号表示法使用这四个速记。它们对于验证 XML 模式中的 XML 引用和值非常有用。正则表达式 \i\c* 匹配 XML 名称,如 xml:schema

The regex <\i\c*\s*> matches an opening XML tag without any attributes. </\i\c*\s*> matches any closing tag. <\i\c*(\s+\i\c*\s*=\s*("[^"]*"|'[^']*'))*\s*> matches an opening tag with any number of attributes. Putting it all together, <(\i\c*(\s+\i\c*\s*=\s*("[^"]*"|'[^']*'))*|/\i\c*)\s*> matches either an opening tag with attributes or a closing tag.

本教程中讨论的其他正则表达式风格不支持 XML 字符类。如果你的 XML 文件是纯 ASCII,你可以使用 [_:A-Za-z] 作为 \i,使用 [-._:A-Za-z0-9] 作为 \c。如果你想允许 XML 标准允许的所有 Unicode 字符,那么你最终会得到一些非常长的正则表达式。你可以使用以下内容代替 \i

[: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]

你可以使用以下内容代替 \c

[-.0-9:A-Z_a-z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]