在字符类之外,在默认匹配模式下,插入符字符 (^
) 是一个断言,只有当当前匹配点位于主题字符串的开头时才为真。在字符类中,插入符 (^
) 有完全不同的含义(见下文)。
插入符 (^
) 不需要是模式的第一个字符,如果涉及多个备选方案,但如果模式要匹配该分支,它应该是每个出现插入符 (^
) 的备选方案中的第一项。如果所有可能的备选方案都以插入符 (^
) 开头,也就是说,如果模式被限制为只匹配主题的开头,那么它被称为“锚定”模式。(还有其他构造会导致模式被锚定。)
美元符号 ($
) 是一个断言,只有当当前匹配点位于主题字符串的末尾,或者紧接在字符串中最后一个字符(默认情况下)的换行符之前时,才为 **true
**。美元符号 ($
) 不需要是模式的最后一个字符,如果涉及多个备选方案,但它应该是出现在美元符号的任何分支中的最后一项。美元符号在字符类中没有特殊含义。
美元符号的含义可以更改,以便它只匹配字符串的末尾,方法是在编译或匹配时设置 PCRE_DOLLAR_ENDONLY 选项。这不会影响 \Z 断言。
如果设置了 PCRE_MULTILINE 选项,则插入符和美元符号的含义将发生变化。在这种情况下,它们分别匹配内部 "\n" 字符之后和之前,除了匹配主题字符串的开头和结尾之外。例如,模式 /^abc$/ 在多行模式下匹配主题字符串 "def\nabc",但在其他情况下则不匹配。因此,在单行模式下由于所有分支都以 "^" 开头而被锚定的模式,在多行模式下不会被锚定。如果设置了 PCRE_MULTILINE,则忽略 PCRE_DOLLAR_ENDONLY 选项。
请注意,序列 \A、\Z 和 \z 可用于匹配主题的开头和结尾,无论 PCRE_MULTILINE 是否设置,如果模式的所有分支都以 \A 开头,它将始终被锚定。