首页 > PHP开发 > php中级 > PHP扩展之文本处理(二)——PCRE正则表达式语法5——锚和句点
2014
11-07

PHP扩展之文本处理(二)——PCRE正则表达式语法5——锚和句点

在一个字符类外面,在默认匹配模式下, ^ 是一个断言当前匹配点位于目标字符串开始处的断言。在一个字符类内部, ^ 表明这个字符类中描述的字符取反(详见下文)。

^ 并不一定要是模式的第一个字符, 但是如果处于某个可选分支时, 它应该是该分支的首字符。如果所有选择分支都以 ^ 开头,这就是说, 如果模式限制为只匹配目标的开头, 它被称为是一个 ”紧固” 模式。(同样也有其他方式可以构造出紧固模式)

$ 是用于断言当前匹配点位于目标字符串末尾, 或当目标字符串以换行符结尾时当前匹配点位于该换行符位置(默认情况)。 $ 不一定要作为模式的最后一个字符,但是如果它在某个可选分支中时, 就应该位于该分支的末尾。 $ 在字符类中没有特殊的意义。

$ 的意义可以通过在编译或匹配时设置 PCRE_DOLLAR_ENDONLY 改变为只匹配字符串末尾。 这不会影响 \Z 断言的行为。

^ 和 $ 字符的意义在 PCRE_MULTILINE 选项被设置时会发生变化。 当在这种情况下时, 它们匹配每一个换行符后面的和前面的字符,另外, 也会匹配目标字符串的开始和结束。比如, 模式 /^abc$/ 在多行模式下会成功匹配目标字符串 ”def\nabc”, 而正常情况下不会。因此,由于所有的可选分支都以 ^ 开始, 在单行模式下这成为紧固模式,然而在多行模式下,这是非紧固的。 PCRE_DOLLAR_ENDONLY 选项在PCRE_MULTILINE 设置后失效。

注意: \A、\Z、 \z 等转义序列可以在任何模式下用于匹配目标字符串的开始和结束位置。 并且如果模式的所有分支都以 \A 开始,它同样是紧固的, 而与 PCRE_MULTILINE 是否设置无关。

句点

在字符类外部,模式中的句点匹配目标字符串中的任意字符,包括非打印字符, 但是(默认)不包括换行符。如果 PCRE_DOTALL 被设置,句点就会匹配换行符。 句点的处理和^、$的处理没有关联,它们唯一的关系是它们都涉及到了换行符。 句点在字符类中没有任何意义。

\C可以被用于匹配单字节, 也就是说在UTF-8模式下,句点可以匹配多字节字符。

编程技巧