2015-05-09 37 views
31

我一直在使用別人的代碼,並且碰到了正則表達式[^0-9a-z-A-Z]。這與常見的[^0-9a-zA-Z]非常類似,這意味着排除非字母數字字符,但請注意小寫字母z和大寫字母A之間的中間的額外短劃線。a-z-A-Z在正則表達式中的含義是什麼?

我對正則表達式不是很熟悉,但現在我已經閱讀了幾個頁面,並且我沒有看到任何規則似乎涵蓋了這個語法的意思。也許它甚至不是有效的語法,但Golang正則表達式解釋器似乎並不介意。我會很感激任何澄清。謝謝。

+2

誰upvoting呢?費了起來!沒有什麼行爲可以想象,在這並不意味着「文字破折號」的情況下是明智的 - OP是否有任何假設? –

回答

52

在不能被解釋爲範圍的地方的字符類中的破折號被解釋爲文字破折號。所以表達式不包括字符09,az,AZ-。這就是爲什麼沒有語法錯誤。

這可能是一個錯字。如果破折號意味着在那裏,那麼爲了防止混淆,應該將其從該範圍之間轉移和/或移出,例如[^0-9a-zA-Z\-]

+3

在正常的POSIX 1003.2正則表達式中,短括號是通過使其成爲第一個或最後一個字符或範圍的第二個端點而包含在括號表達式中的。另外**最重要的**'\'字符在括號表達中失去了所有特殊含義! –

+3

@ GregA.Woods:快速瀏覽文檔告訴我Go使用Perl語法,可能通過PCRE庫。如果這個正則表達式在標籤暗示的Go中被使用,反斜槓將總是被視爲一個轉義字符。 –

+0

@ GregA.Woods:POSIX標準與此處的討論無關。 Go無論如何都會實現自己的語法。 – nhahtdh

0

它排除了減號。

您可以輕而易舉地在這裏測試的正則表達式:http://www.regexr.com/

+6

從該頁面:「RegExr使用您的瀏覽器的RegExp引擎進行匹配,其語法突出顯示和文檔反映了Javascript RegExp標準。」因此,語法可能與[Go的RE2](https://github.com/google/re2/wiki/Syntax)的支持不同。 –

+3

@DaveC你是對的,但不是在IMO這個問題的背景下。根據我的經驗,基本的正則表達式語法(如OP的'[^ 0-9a-z-A-Z]')在不同的引擎之間並沒有多大差別。例如,我敢打賭,在大多數瀏覽器中,http://regexr.com/3avj4的結果與http://play.golang.org/p/ozmtbUHH7C相同。 –

+0

這與本問題中使用的語法無關,但我只是想明確指出,該網站(以及其他許多人喜歡它)與RE2的語法不完全匹配,並且通常不能在Go和這樣的網站。我見過很多正則表達式問題,顯然提問者並不知道語法差異。 –

相關問題