2009-12-03 92 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