2009-12-03 93 views
2

我寫了下面的代碼來執行不區分大小寫的C#替換:什麼是要注意的區分大小寫正則表達式替換?

Regex.Replace(textBoxText, 
    Regex.Escape(findText), 
    replaceText, 
    RegexOptions.IgnoreCase); 

只是想檢查一下,這是否是正確的做法,或者是有沒有更好的辦法,我是否忽視的東西,我應該更好地意識到。

注意:請不要提供一些手工製作的代碼,我使用了codeproject中的快速替換功能,並且代碼在客戶端崩潰,我無法知道用戶正在使用什麼輸入。所以,我更喜歡一些簡單但正確可靠的方法。

+0

我同意這不是重複。 – 2009-12-03 14:31:58

回答

7

您的代碼似乎沒問題,但請記住,當您進行不區分大小寫的匹配時,請使用當前的語言環境或文化。最好添加你想要的文化,或讓用戶選擇它。 CultureInvariant通常是採取行動的同在任何語言環境的好一般選擇:

Regex.Replace(textBoxText, 
    Regex.Escape(findText), 
    replaceText, 
    RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); 

要使用其他語言環境,你需要做的多一點騙人把戲:

// remember current 
CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture; 

// set user-selected culture here (in place of "en-US") 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 

// do the regex 
Regex.Replace(textBoxText, 
    Regex.Escape(findText), 
    replaceText, 
    RegexOptions.IgnoreCase); 

// reset the original culture 
Thread.CurrentThread.CurrentCulture = originalCulture; 

請注意,您可以切換的情況下不敏感開啓或關閉。它不是一個切換,這意味着:

// these three statements are equivalent and yield the same results: 
Regex.Replace("tExT", "[a-z]", "", RegexOptions.IgnoreCase); 
Regex.Replace("tExT", "(?i)[a-z]", "", RegexOptions.IgnoreCase); 
Regex.Replace("tExT", "(?i)[a-z]", ""); 

// once IgnoreCase is used, this switches it off for the whole expression... 
Regex.Replace("tExT", "(?-i)[a-z]", "", RegexOptions.IgnoreCase); 

//...and this can switch it off for only a part of the expression: 
Regex.Replace("tExT", "(?:(?-i)[a-z])", "", RegexOptions.IgnoreCase); 

最後一個是有趣:非捕獲分組括號後的(?:)之間的情況下,開關(?-i)無效了。你可以在表達式中儘可能多地使用它。無需分組就可以使用它,直到下一個區分大小寫切換或結束時纔有效。

更新:我做了錯誤的假設,你不能做區分大小寫切換。上面的文字是根據這個編輯的。

+0

我沒有得到這部分:'但它不可能切換區分大小寫'?另外如何設置用於比較的區域設置? – 2009-12-03 14:16:49

+0

對不起,被電話打斷了,打太快了。看到我的編輯,它回答了你的問題,我想。 – Abel 2009-12-03 14:20:36

+0

正則表達式基本上是用戶輸入的,它會被轉義,所以它不會像有效的正則表達式那樣提問。所以,我認爲RegexOptions.CultureInvariant是更好的選擇。另外我只想找英語。 – 2009-12-03 14:25:12