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

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

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

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

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

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

add a note add a note

User Contributed Notes 1 note

up
1
srf
7 years ago
Outside square brackets : assert start of subject (or line, in multiline mode)

Inside square brackets : negate the class, but only if the first character

[^0]  which means - all but 0
[^A]  which means - all but A & so on
To Top