2011-11-23 182 views
5

System.Text.RegularExpressions.Regex.Escape()只能脫開大括號。是否有一個.NET Framework方法逃避了在正則表達式中使用大括號?我似乎無法找到任何。我討厭硬編碼字符。逃脫關閉大括號

編輯:我需要爲平衡組定義生成「(?< -open>)」標記。我收到代表結尾分隔符的字符列表,將它們轉義並將它們添加到「(?< -open>)」標記中的表達式中。所以,是的,我真的不得不逃避右花括號。

+2

MSDN說:「如果右括號或大括號沒有對應的開頭字符,則正則表達式引擎會直接解釋它」。你確定你需要逃避閉合括號嗎? –

+0

@TimBourguignon:我想你也可以把這個作爲答案。 –

回答

1

當我嘗試它時,Regex.Escape確實會逃脫。你的代碼中還有其他的東西嗎?發佈一個可重複使用的轉義代碼和正則表達式的例子會很有幫助。我認爲蒂姆的評論可能也是關於發生了什麼的標誌。

FWIW,測試Regex.Escape()給出了以下結果:

Regex.Escape("(Hello)"); // \(Hello\) 
Regex.Escape("Hello)"); // Hello\) 
Regex.Escape("(Hello"); // \(Hello 

編輯:從我明白你的意思的意見確定{現在,並與測試給你說的結果。 Regex.Escape()試圖在需要時才轉義,但如果這不是你想要的,那麼沒有任何其他內置方法可以工作。我認爲你必須1)添加它自己丟失的內容,或者2)如果可能的話,以不同的方式格式化你的輸入字符串,這樣Regex.Escape將按預期工作。

+0

有趣的事情。當我嘗試同樣的事情時,第二個結果是「你好)」。嗯。奇怪的。 – dijxtra

+0

這些是括號(又名圓括號);用方括號或花括號來試試它(人們通常用我的經驗中的「大括號」來表示),而且你會發現它只能逃脫開場之一。 –

+0

哦,雙重檢查,是的,我在我的例子中使用方括號。 – dijxtra

4

如在評論說以上,退出函數的行爲如下(MSDN):

轉義最少的一組字符(\,*,+,的|,{[? ,(,),^,$,。,#,和空格)替換它們的轉義碼。這指示正則表達式引擎逐字地解釋這些字符而不是元字符。

以下備註添加:

雖然退出方法逸出的直開口括號([)和開口括號({)字符,它不會逃脫其相應的閉合字符(]和} )。在大多數情況下,逃避這些是沒有必要的。 如果右括號或大括號沒有對應的開頭字符,則正則表達式引擎會按字面解釋。如果開頭的大括號或大括號被解釋爲元字符,則正則表達式引擎將第一個對應的結尾字符解釋爲元字符。如果這不是所需的行爲,則應通過顯式預置反斜槓()字符來隱藏結束括號或大括號。有關說明,請參閱示例部分。

因此,如果解釋器發現不被開口{它將自動地逃脫它前面一個}

+0

我知道這一點。但是,這不是我所問的:-)無論如何,謝謝你的回答,這是努力的成果。 – dijxtra

+0

感謝您的支持。我發現最好的東西就是用你自己的EscapeExtended()函數來擴展Regex類來照顧那些額外的字符;但這幾乎是你不想做的硬編碼。 –

+0

是的,我已經寫了一個私人的靜態方法來做到這一點,不需要將它添加到正則表達式類。所以現在我正在尋找更優雅的解決方案...... – dijxtra