我已经编写了以下代码来在 C# 中进行不区分大小写的替换:
Regex.Replace(textBoxText,
Regex.Escape(findText),
replaceText,
RegexOptions.IgnoreCase);
只是想检查一下,这是否是正确的方法,或者是否有更好的方法,以及我是否忽略了一些我应该更好地注意的事情。
注意:请不要向我提供一些手工制作的代码,我使用了 codeproject 的快速替换功能,该代码在客户端崩溃,我无法知道用户使用的是什么输入。所以,我更喜欢一些简单但正确可靠的方法。
最佳答案
您的代码看起来没问题,但请记住,当您像这样进行不区分大小写的匹配时,您使用的是当前的语言环境或文化。最好添加您想要的文化,或者让用户选择它。 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)
不再有效.您可以在表达式中随意使用它。在不分组的情况下使用它可以使它们在下一次区分大小写切换或结束之前有效。
更新:我错误地假设您不能进行区分大小写的切换。考虑到这一点编辑以上文本。
关于c# - 替换不区分大小写的正则表达式需要注意什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1840047/