2011-03-27 64 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