2013-06-27 41 views
4

我有一個正則表達式來檢查腳本語言中的有效標識符。它們以字母或下劃線開頭,可以跟隨0個或多個字母,下劃線,數字和$符號。但是,如果我打電話正則表達式奇數

Util.IsValidIdentifier("hello\n"); 

它返回true。我的正則表達式是

const string IDENTIFIER_REGEX = @"^[A-Za-z_][A-Za-z0-9_\$]*$"; 

那麼「\ n」如何得到?

+1

Wut? lawl。你的第二個字符類有一個反斜槓。看起來,你試圖「逃避」「尾線」角色,但你實際上做的是允許反斜槓和美元符號。在字符級別內,美元符號是美元符號。試圖逃脫它只是告訴它,你想讓斜槓和美元符號。 – Suamere

+0

而不是'@「^(?i)[a-z _] [\ w $] * $」;'...(?i)表示不區分大小寫,\ w表示單詞字符,其中包括A-Za -z0-9和下劃線。 – Suamere

+0

這仍然不是很正確:什麼工作是@「^(?i)[a-z _] [\ w $] * \ z」 –

回答

5

$與行尾相符。您需要使用\z來匹配文本的末尾,以及RegexOptions.Multiline。您可能還想使用\A而不是^來匹配文本的開頭,而不是線條。

此外,您不需要轉義字符類中的$

+0

謝謝,它排序! –

+0

@JulianGold不客氣。 – ctn

1

因爲$是一個有效的元字符,它意味着字符串的結尾(或行末,就在換行符之前)。從msdn:

$:匹配必須發生在字符串的末尾或在行或字符串末尾的\ n之前。

你應該逃避它:\$(並且如果你想匹配那裏的字符串的末尾加\z)。

0

你的結果是truehello\n,因爲你不需要逃避$字符類中,從而反斜線匹配,因爲你的字符類中的反斜槓(視爲文本)。

試試這個:

const string IDENTIFIER_REGEX = @"^[A-Za-z_][A-Za-z0-9_$]*$"; 

由於要測試的變量名是在一行中,你可以使用$作爲字符串的結尾。

+1

''你好\ n「'沒有反斜槓 – ctn