2012-05-02 36 views
2

我在做一個匹配比較一些轉義字符串:Regex.IsMatch()不能識別轉義序列?

Regex.IsMatch("\\Application.evtx", "DebugLogs\\ConfigurationServices.log"); 

我不明白爲什麼我得到:

「解析‘DebugLogs \ ConfigurationServices.log’ - 無法識別逃生序列\ C「。

\C是逃脫?

+0

請參閱http://stackoverflow.com/questions/1302864/unrecognized-escape-sequence-for-string-containing-backslashes-in-c-sharp - 實際上,您需要轉義反斜槓,它本身就是轉義字符 - 「DebugLogs \\ ConfigurationServices.log」或@「DebugLogs \ ConfigurationServices.log」 - 我投票結束這並不是因爲它是一個糟糕的問題,而是因爲它已經被覆蓋SO – dash

+0

對每個人的道歉,但有人編輯我的帖子...我有兩個反斜槓,每個人都將其轉換爲一個。我認爲這太添加語法突出或一些廢話... – Darkenor

+0

對不起,這是因爲你實際上是將字符串提供給RegEx--所以它看到RegEx「DebugLogs \ ConfigurationServices.log」並將\ C視爲轉義序列(它不是,因此錯誤)。將您的字符串更改爲Regex.IsMatch(「\\\\ Application.evtx」,「DebugLogs \\\\ ConfigurationServices。log「);在RegEx中轉義反斜槓,強制它將其視爲反斜槓而不是轉義序列:-)這基本上是因爲反斜槓在正則表達式中具有特殊含義,所以我們將其轉義以除去該含義。 – dash

回答

4

編輯真的欺騙了很多人,包括我!

'\'是正則表達式中的特殊字符 - 它是effectively is an escape character or denotes an escape sequence

因此,RegEx引擎會看到DebugLogs * \ C * onfigurationServices.log,這實際上是一個無法識別的轉義序列。 \ A實際上是一個現有的轉義序列。

所以你需要逃避轉義字符。要做到這一點最簡單的方法就是使用雙倍的斜槓數:

Regex.IsMatch("\\\\Application.evtx", "DebugLogs\\\\ConfigurationServices.log"); 

其中正則表達式引擎將看到betweeen「\\ Appplication.evtx」和「DebugLogs \\ ConfigurationServices.log」比較 - 現在反斜槓已經逃脫並沒有特別的意義。

Regex.IsMatch(@"\\Application.evtx", @"DebugLogs\\ConfigurationServices.log"); 

工作正常,更具可讀性。

1

\字符是字符串中的轉義字符。例如,如果您想要回車,請使用\r。爲了解決這個問題或者使用文本字符串

@"\Application.evtx" 

或轉義轉義字符

"\\Application.evtx" 
-2

你可能想

Regex.IsMatch(@"\Application.evtx", @"DebugLogs\ConfigurationServices.log"); 

沒有 「@」 C#將把\ C作爲一種逃生序列類似於將\ n轉換爲換行符的方式,但是\ C不是可識別/有效的轉義序列。