介绍
下面说明 PCRE 所支持的正则表达式的语法和语义。Perl 文档和很多其它书中也解说了正则表达式,有的书中有很多例子。Jeffrey Friedl 写的“Mastering Regular Expressions”,由 O'Reilly 出版社发行(ISBN 1-56592-257-3),包含了大量细节。这里的说明只是个参考文档。
正则表达式是从左向右去匹配目标字符串的一组模式。大多数字符在模式中表示它们自身并匹配目标中相应的字符。作为一个小例子,模式 The quick brown fox 匹配了目标字符串中与其完全相同的一部分。
元字符
正则表达式的威力在于其能够在模式中包含选择和循环。它们通过使用元字符来编码在模式中,元字符不代表其自身,它们用一些特殊的方式来解析。
有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号内被识别的。方括号之外的元字符有这些:
- 有数种用途的通用转义符
- ^
- 断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)
- $
- 断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)
- .
- 匹配除了换行符外的任意一个字符(默认情况下)
- [
- 字符类定义开始
- ]
- 字符类定义结束
- |
- 开始一个多选一的分支
- (
- 子模式开始
- )
- 子模式结束
- ?
- 扩展 ( 的含义,也是 0 或 1 数量限定符,以及数量限定符最小值
- *
- 匹配 0 个或多个的数量限定符
- +
- 匹配 1 个或多个的数量限定符
- {
- 最少/最多数量限定开始
- }
- 最少/最多数量限定结束
- 通用转义字符
- ^
- 排除字符类,但仅当其为第一个字符时有效
- -
- 指出字符范围
- ]
- 结束字符类
反斜线()
反斜线字符有几种用途。首先,如果其后跟着一个非字母数字字符,则取消该字符可能具有的任何特殊含义。此种将反斜线用作转义字符的用法适用于无论是字符类之中还是之外。
例如,如果想匹配一个“*”字符,则在模式中用“*”。这适用于无论下一个字符是否会被当作元字符来解释,因此在非字母数字字符之前加上一个“”来指明该字符就代表其本身总是安全的。尤其是,如果要匹配一个反斜线,用“\”。
Note: 单引号或双引号括起来的 PHP 字符串中的反斜线有特殊含义。因此必须用正则表达式的 \ 来匹配 ,而在 PHP 代码中要用 "\\" 或 '\\'。
如果模式编译时加上了 PCRE_EXTENDED 选项,模式中的空白字符(字符类中以外的)以及字符类之外的“#”到换行符之间的字符都被忽略。可以用转义的反斜线将空白字符或者“#”字符包括到模式中去。
反斜线的第二种用途提供了一种在模式中以可见方式去编码不可打印字符的方法。并没有不可打印字符出现的限制,除了代表模式结束的二进制零以外。但用文本编辑器来准备模式的时候,通常用以下的转义序列来表示那些二进制字符更容易一些:
- a
- alarm,即 BEL 字符(0x07)
- cx
- "control-x",其中 x 是任意字符
- e
- escape(0x1B)
- f
- 换页符 formfeed(0x0C)
- 换行符 newline(0x0A)
- 回车符 carriage return(0x0D)
- 制表符 tab(0x09)
- xhh
- 十六进制代码为 hh 的字符
- ddd
- 八进制代码为 ddd 的字符,或 backreference
“cx”的精确效果如下:如果“x”是小写字母,则被转换为大写字母。接着字符中的第 6 位(0x40)被反转。从而“cz”成为 0x1A,但“c{”成为 0x3B,而“c;”成为 0x7B。
在“x”之后最多再读取两个十六进制数字(其中的字母可以是大写或小写)。在 UTF-8 模式下,允许用“x{...}”,花括号中的内容是表示十六进制数字的字符串。原来的十六进制转义序列 xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。
在“