代码之家  ›  专栏  ›  技术社区  ›  Priyank Bolia

对于不区分大小写的regex replace,需要注意什么?

  •  2
  • Priyank Bolia  · 技术社区  · 15 年前

    我已经编写了以下代码来在C中进行不区分大小写的替换:

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

    只是想检查一下,这是正确的方法,还是有更好的方法,以及我是否忽略了一些我应该更清楚的事情。

    注意:请不要给我提供一些手工编写的代码,我使用了codeproject中的快速替换函数,代码在客户端崩溃,我无法知道用户使用的是什么输入。所以,我更喜欢一些简单但正确可靠的方法。

    1 回复  |  直到 13 年前
        1
  •  7
  •   Abel    15 年前

    您的代码看起来还可以,但是请记住,当您进行这种不区分大小写的匹配时,您将使用当前的区域设置或区域性。最好是添加您想要的区域性,或者让用户选择它。 CultureInvariant 通常是在任何地区采取相同行动的一个好的一般选择:

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

    要使用另一个区域设置,您需要进行更多的Hocus Pocus:

    // 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);
    

    最后一个很有趣:在 (?:) 在非捕获分组括号之后,case开关 (?-i) 不再有效。您可以在表达式中随意使用它。在下一个区分大小写开关之前,或者到最后,不分组地使用它会使它们有效。

    更新: 我错误地认为你不能进行区分大小写的切换。上面的文字是在编辑时考虑到的。