正则表达式锚点的库存

时间:2011-03-27 18:45:05

标签: regex anchor

  1. ^据说与行的开头相匹配,但在"\n""\r"或{{之后不匹配1}}。但它匹配字符串的开头。它在什么意义上与一行的开头相匹配,它与"\r\n"有什么不同?

  2. \A据说与一行匹配,但在$"\n"或{{之前不匹配1}}。但它匹配字符串的结尾。它在什么意义上与一行的结尾相匹配,它与"\r"有什么不同?

  3. "\r\n"\z不同,如果它位于字符串末尾,则会在\Z之前匹配。在我看来,\z"\n"是自然配对的概念,而\A则是一个奇怪的概念。为什么\z\Z被定义为原样,而不是相反?而且,您何时想使用\Z

  4. 你能举例说明以上内容吗? 如果语言/标准之间的差异很重要,列出它们会很有帮助。

1 个答案:

答案 0 :(得分:4)

区别在于^$锚点可以修改行为。

启用multiline模式后,^$锚点会断言一行的开头和结尾。

关闭multiline模式后,^$锚点会断言字符串的开头和结尾。


大多数正则表达式实现都具有multiline模式。

使用Ruby,Perl或Javascript,它使用m修饰符定义。例如/pattern/m

在.NET中,它在模式本身内部使用(?m)定义,或者从RegexOptions.Multiline枚举定义。


回答你的第3个问题......

\A - 匹配必须出现在字符串的开头。

\Z - 匹配必须发生在字符串的末尾或字符串末尾的\n之前。

\z - 匹配必须发生在字符串的末尾。

这三个是不受任何修饰符影响的常量。我同意\A\z似乎是不合逻辑的配对。它对我来说也没有多大意义。但是,如果可能有一个您希望忽略的尾随换行符,则可能首选\Z