2010-04-16 66 views
12

末線錨$比賽甚至有多餘的匹配字符串結尾\n,所以我們使用\Z代替$什麼時候應該在正則表達式中使用 A?

例如

^\w+$將匹配字符串abcd\n^\w+\Z不是

如何約\A以及何時使用?

+0

難道你不是指'^ \ w + \ z'(小寫z)嗎? '\ Z'和'$'是相同的(當你不使用'/ m'修飾符時)。 – cjm 2010-04-16 05:17:36

+0

@cjm,我測試了python和恕我直言,它不是相同的,'^ \ w + \ Z'不匹配'abcd \ n',但$是,但我不確定python和perl正則表達式實現'\ Z '是不同的,但是在Python中'\ Z'和'\ z'是一樣的,(我認爲是因爲我在Python文檔中沒有看到'\ z'),所以我目前沒有Perl。 – YOU 2010-04-16 05:58:24

+0

@cjm,我剛剛在codepad.org上測試過,是的,Python中的'\ Z'我的意思是perl中的'\ z',我認爲它們在兩種語言中都是相同的。 – YOU 2010-04-16 06:02:38

回答

20

通常在啓用多行匹配時使用它。由於\A只在整個文本的開始處匹配,而不僅僅是一行開始,所以在可跨線匹配的正則表達式中,^\A的功能是不同的。

+0

+1謝謝,但人們真的使用它?不刪除'/ m'並使用'^'是相同的行爲? – YOU 2010-04-16 04:30:25

+0

是的,我使用它。考慮嘗試搜索一個你希望沒有嵌入換行符的字符串,但用戶將它們放入。你希望能夠搜索整個字符串,但是^和$會感到困惑,只能掃描字符串的第一部分。您最終可能會將一些惡意代碼注入查詢或將其存儲在數據庫中。是的,這很令人困惑,但\ m,\ A,\ z,^和$有他們的用途,所以您需要了解何時何地使用它們。也許這不是一個好例子,但它可能非常重要。也許有人可以添加一些真實世界的例子。 – 2010-04-16 05:32:59

+0

如果你想在一組日誌中的某個日誌文件的開頭匹配一對特定的行,你需要啓用多行匹配,但不能只使用'^'(因爲你想在日誌文件的開頭匹配行,而不是在中間)。這將是一個潛在的用例。 – Amber 2010-04-16 06:41:23

4

與任何正則表達式功能一樣,當它更準確地描述您需要的是什麼而不是任何更一般的功能時,就可以使用它。如果您知道要在字符串的開頭(而不是邏輯行)準確匹配,請使用描述該字符串的正則表達式功能。不要使用可能與您不需要的情況相匹配的正則表達式功能。

在Perl,看到perlre文檔有關零寬度斷言細節:

\b Match a word boundary 
\B Match except at a word boundary 
\A Match only at beginning of string 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 
\G Match only at pos() (e.g. at the end-of-match position 
    of prior m//g) 
2

不能直接根據你使用的標記你的問題相關,但有至少一個語言(紅寶石)其中^$總是意味着開始/結束線,因此,如果你想匹配的開始/結束的字符串,你使用\A\Z\z

如果你想讓你的正則表達式便攜,這是很好的做法,明確說明你希望他們做的,而不是依賴於模式修飾符像\mRegex.MULTILINE

在另一方面,JavaScript的可用性什麼,POSIX和XML不支持\A\Z。這就是像RegexBuddy這樣的工具派上用場,可以將正則表達式從一種風格轉換爲另一種風格。

+0

感謝有關紅寶石正則表達式的信息,+1 – YOU 2010-04-16 06:28:26

2

如果您正在使用的正則表達式支持\A那麼我建議您始終使用它而不是^\A始終只在所有支持它的類型中匹配字符串的開頭。換行符沒有問題。

^可能僅匹配字符串的開始或任何行的開始位置,具體取決於正則表達式的風格和正則表達式選項。

通過使用\A,您可以減少其他人必須維護代碼時出現混淆的可能性。

+0

感謝您的建議Jan Goyvaerts,這是有道理的 – YOU 2010-04-23 07:15:34

相關問題