2011-03-27 73 views
4
  1. ^据说匹配开头的行的,但它"\n""\r""\r\n"之后不匹配。不过,它匹配一个字符串的开头。它在什么意义上匹配一行的开头,它与\A有什么不同?库存正则表达式的锚

  2. $被说成一条线的末匹配,但它并没有之前"\n""\r""\r\n"权相匹配。不过,它匹配一个字符串的结尾。它在什么意义上匹配一条线的末端,它与\z有什么不同?

  3. \Z,与\z不同,在"\n"之前匹配,如果它在字符串的末尾。在我看来,\A\z是自然配对的概念,而\Z则相当古怪。为什么\Z\z被定义为是,而不是相反?而且,您想在什么时候使用\Z

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

回答

4

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

随着multiline模式启用,^$锚定符断言行的开始和结束。

随着multiline模式关闭,^$锚点断言字符串的开始和结束。


大多数正则表达式的实现都有一个multiline模式。

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

在.NET中,它的模式本身或RegexOptions.Multiline枚举中定义为(?m)


要回答你的第三个问题...

\A - 本场比赛必须出现在字符串的开始。

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

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

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

+1

+1多行修饰符也适用于PHP和Python。 – ridgerunner 2011-03-27 19:12:39

+1

在Ruby中,'m'修饰符表示大多数语言被认为是's'修饰符(又名:DOT ALL)。引用:_“/ m使点匹配换行符,Ruby确实使用/ m,而Perl和许多其他编程语言使用/ s来表示”点匹配换行符“。”_ from:http://www.regular-expressions.info /ruby.html – 2011-03-27 19:13:45

+1

此外,大多数类似PCRE的正则表达式实现支持内联修饰符,如'(?m)'。这不限于.NET。 – 2011-03-27 19:17:07