2011-08-24 160 views
3

我有一個像下面這樣的代碼,其中'QualifiedInstanceFilter'是限定實例過濾器的訪問器。任何人都可以告訴我該行發生了什麼邏輯m_afc.QualifiedInstanceFilter =「^(」+ Regex.Escape(this.Identifier)+「)$」; 即是通過與他們逃跑的代碼來替換它們全碼Regex.Escape的目的是什麼?

public override string Identifier 
     { 
     get 
     { 
return string.Format("{0}{1}{2}{3}{4}", 
       Owner.Class, 
       IDSeparator, 
       ManagedClass.Name, IDClassNameSeparator, Instance); 

private AlertFilter m_afc = new AlertFilter("", "", true, "", "", ""); 

    m_afc.QualifiedInstanceFilter = "^(" + Regex.Escape(this.Identifier) + ")$"; 
+1

你有沒有試過看MSDN? – leppie

回答

3

Regex.Escape是否存在「轉義」可能包含在正則表達式中具有特殊含義的字符的字符串。例如(一個簡單的例子):

比方說,我想搜索基於用戶輸入的字符串。人們會認爲我可以編寫一個像".*" + UserInput + ".*"這樣的正則表達式。這個問題是如果用戶搜索「$ money」? $在正則表達式中有特殊含義,因此在這個正則表達式中解析:.*$money. - 這是不正確的。

如果在此之前我們使用了Regex.Escape,那麼$字符會被轉義以避免這種行爲。

您可以從documentation瞭解更多關於它的信息。

2

MSDN

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

在你的代碼,它是設置一個連接字符串等於m_afc.QualifiedInstanceFilter和「逃逸」無論是在this.Identifier。如果有任何特殊字符,則它們預先加上\並視爲非元字符。

1

,它們一起組成了一個Identifier字符串是任意的字符串 - 他們可以想到的是包括這樣的字符爲[]*\和所有具有正則表達式中具有特殊含義的其他字符。然而,QualifiedInstanceFilter所期望的效果是字面匹配Identifier,所以如果我們剛纔說

m_afc.QualifiedInstanceFilter = "^(" + this.Identifier + ")$"; 

我們可能與諸如^(()$(${P${}$*${$}{$)$一個值,這將極大地混淆了正則表達式引擎告終。所以我們用Regex.Escape地說:「我想在正則表達式中使用此字符串,但我想這通常是特別的正則表達式來沒有自己的特殊含義的字符」。然後,正則表達式引擎將特殊字符轉義(前面加上一個\),這樣,當我們通過concatentation創建一個普通的epxression,它唯一的正則表達式,特殊字符,我們把那裏的 - 最初^(和最終)$

1

說得更多一點就是比其他的答案:

,如果你想匹配的字符是在正則表達式特殊字符,例如你是做什麼一段時間 」。」?你把一個反斜槓在它的前面,即你逃脫它。

Regex.Escape對於你傳遞的任何字符串都這樣做,所以它可以在編譯時轉義你不知道的東西。一個例子是在正則表達式中包含用戶指定的字符串,其中可能包含特殊字符。