问题 不区分大小写'包含(字符串)'
有没有办法让以下返回true?
string title = "ASTRINGTOTEST";
title.Contains("string");
似乎没有一个重载允许我设置区分大小写..目前我大写他们两个,但这只是愚蠢(我指的是 国际化 上下套管带来的问题)。
UPDATE
这个问题是古老的,从那时起我就意识到,如果你想完全研究它,我会要求一个简单的答案来解决一个非常庞大而困难的话题。
对于大多数情况,使用单语言,英语代码库 这个 答案就够了。我怀疑是因为大多数人来到这个类别这是最受欢迎的答案。
这个 然而,答案提出了一个固有的问题,即我们无法比较文本不区分大小写,直到我们知道两种文本是相同的文化并且我们知道文化是什么。这可能是一个不太受欢迎的答案,但我认为它更正确,这就是为什么我这样标记它。
7862
2018-01-14 21:39
起源
答案:
测试是否为字符串 paragraph
包含字符串 word
(感谢@QuarterMeister)
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
哪里 culture
是的例子 CultureInfo
描述文本所写的语言。
这个解决方案是透明的 不区分大小写的定义,它取决于语言。例如,英语使用字符 I
和 i
对于第九个字母的大写和小写版本,而土耳其语使用这些字符 第十一和第十二封信 它的29个字母长的字母表。土耳其大写版本的'i'是不熟悉的角色'İ'。
因此弦乐 tin
和 TIN
是同一个词 用英语,但不同的话 用土耳其语。据我所知,一个是“精神”,另一个是拟声词。 (土耳其人,请纠正我,如果我错了,或建议一个更好的例子)
总而言之,您只能回答“这两个字符串是否相同但在不同情况下”的问题 如果你知道文本是什么语言。如果你不知道,你将不得不采取行动。鉴于英语在软件方面的霸权,你应该诉诸于此 CultureInfo.InvariantCulture
,因为熟悉的方式会出错。
1088
2018-03-17 18:22
你可以使用 String.IndexOf方法 并通过 StringComparison.OrdinalIgnoreCase
作为要使用的搜索类型:
string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
更好的是为字符串定义一个新的扩展方法:
public static class StringExtensions
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source?.IndexOf(toCheck, comp) >= 0;
}
}
注意 零传播 ?.
自C#6.0(VS 2015)起可用,适用于旧版本
if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;
用法:
string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);
2361
2018-01-14 21:44
您可以使用 IndexOf()
喜欢这个:
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// The string exists in the original
}
由于0(零)可以是索引,因此请检查-1。
MSDN
如果找到该字符串,则从零开始的索引位置值为-1
如果不是。如果value为String.Empty,则返回值为0。
203
2018-01-14 21:48
使用Regex的替代解决方案:
bool contains = Regex.IsMatch("StRiNG to search", "string", RegexOptions.IgnoreCase);
注意
正如@cHao在他的评论中指出的那样,有一些情况会导致这个解决方案返回错误的结果。 在随意实施此解决方案之前,请确保您知道自己在做什么。
116
2017-07-28 17:18
您可以先将字符串向上或向下翻转。
string title = "string":
title.ToUpper().Contains("STRING") // returns true
哎呀,刚看到最后一点。不区分大小写的比较会 *
大概*
无论如何都要做同样的事情,如果性能不是问题,我没有看到创建大写副本和比较它们的问题。我曾经发誓我曾经看过一次不区分大小写的比较...
63
2018-01-14 21:42
答案的一个问题是,如果字符串为null,它将抛出异常。您可以将其添加为支票,这样就不会:
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
return true;
return source.IndexOf(toCheck, comp) >= 0;
}
48
2017-12-07 21:11
StringExtension类是前进的方法,我结合上面的几个帖子给出了一个完整的代码示例:
public static class StringExtensions
{
/// <summary>
/// Allows case insensitive checks
/// </summary>
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
}
32
2017-11-18 16:48
这很简洁。
Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
31
2017-11-09 04:25
OrdinalIgnoreCase,CurrentCultureIgnoreCase还是InvariantCultureIgnoreCase?
由于缺少这个,这里有一些关于何时使用哪一个的建议:
DOS
- 使用
StringComparison.OrdinalIgnoreCase
比较
作为与文化无关的字符串匹配的安全默认值。
- 使用
StringComparison.OrdinalIgnoreCase
对比
为了提高速度。
- 使用
StringComparison.CurrentCulture-based
字符串操作
在向用户显示输出时。
- 切换当前使用基于不变量的字符串操作
文化使用非语言
StringComparison.Ordinal
要么 StringComparison.OrdinalIgnoreCase
当比较时
在语言上无关紧要(例如,象征性的)。
- 使用
ToUpperInvariant
而不是 ToLowerInvariant
什么时候
规范化字符串以进行比较。
注意事项
- 对未明确的字符串操作使用重载
或隐式指定字符串比较机制。
- 使用
StringComparison.InvariantCulture
基于字符串
大多数情况下的操作;少数例外之一
坚持语言上有意义但与文化无关的数据。
根据这些规则,您应该使用:
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
// The string exists in the original
}
而[YourDecision]取决于上述建议。
来源链接: http://msdn.microsoft.com/en-us/library/ms973919.aspx
24
2018-06-17 10:31