【发布时间】:2013-03-10 14:28:06
【问题描述】:
如何测试子字符串是否包含在其他字符串中,但不区分大小写?
string1.Contains(string2) 不区分大小写。如果没有现有的方法,我想写一个优化的方法,有什么指针吗?
编辑:它也应该适用于全球化。
【问题讨论】:
如何测试子字符串是否包含在其他字符串中,但不区分大小写?
string1.Contains(string2) 不区分大小写。如果没有现有的方法,我想写一个优化的方法,有什么指针吗?
编辑:它也应该适用于全球化。
【问题讨论】:
您可以在执行检查之前将两个字符串都转换为大写:
string1.ToUpperInvariant().Contains(string2.ToUpperInvariant())
或者,如果您想在定义不区分大小写时考虑当前文化:
string1.ToUpper().Contains(string2.ToUpper())
或者您甚至可以通过调用接受CultureInfo 的ToUpper 重载来使用特定的文化。
code analysis warning CA1308: Normalize strings to uppercase 中描述了您应该转换为大写而不是小写的原因:
字符串应该被规范化为大写。一小部分字符在转换为小写时不能往返。往返意味着将字符从一种语言环境转换到另一种以不同方式表示字符数据的语言环境,然后从转换后的字符中准确地检索出原始字符。
您可能想知道哪些“小字符组”受此影响,显然至少一些格鲁吉亚文字根据Michael S. Kaplan 存在此问题。
【讨论】:
ToUpperInvariant 使用基于“en-US”文化的不变文化 (CultureInfo.InvariantCulture) 转换为大写。大写字母 i 将导致 I。正如 Soner Gönül 所指出的,使用 ToUpper(CultureInfo.GetCultureInfo("tr-TR")) 将导致 İ(土耳其大写加点 I)。
使用String.IndexOf Method (String, StringComparison)
string str = "Some test String";
string str2 = "test";
if (str.IndexOf(str2, StringComparison.InvariantCultureIgnoreCase) > 0)
{
//str contains str2
}
else
{
//str does not contain str2
}
【讨论】:
string1.ToUpper().Contains(string2.ToUpper())
【讨论】:
你可以使用String.IndexOf Method (String, StringComparison)这个重载
对于StringComparison.InvariantCultureIgnoreCase
使用文化敏感的排序规则比较字符串,不变量 文化,并忽略正在比较的字符串的大小写。
string string1 = "YOURSTRING";
bool containsornot = string1 .IndexOf("yourstring", StringComparison.InvariantCultureIgnoreCase) >= 0;
这是DEMO。
【讨论】:
你试过string1.IndexOf(string2, StringComparison.InvariantCultureIgnoreCase)
或使用 StringComparison.OrdinalIgnoreCase
【讨论】:
StringComparison.OrdinalIgnoreCase 的重载