c# - 不区分大小写'包含(字符串)'




12 Answers

测试字符串paragraph包含字符串word (感谢@QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

cultureCultureInfo的实例,描述了文本的编写语言。

这种解决方案对于不区分大小写的定义是透明的, 这种定义与语言有关 。 例如,英语使用字符Ii作为第九个字母的大写和小写版本,而土耳其语使用这些字符作为其29个字母长字母表的第十一和第十二个字母。 土耳其大写版本的'i'是不熟悉的角色'İ'。

因此,字符串tinTIN 在英语中是相同的单词,但在土耳其语中是不同的单词。 据我所知,一个是“精神”,另一个是拟声词。 (土耳其人,请纠正我,如果我错了,或建议一个更好的例子)

总而言之, 如果你知道文本是什么语言 ,你只能回答“这两个字符串是否相同但在不同情况下” 的问题 。 如果你不知道,你将不得不采取行动。 鉴于英语在软件方面的霸权,你应该求助于CultureInfo.InvariantCulture ,因为它会以熟悉的方式出错。

有没有办法让以下返回true?

string title = "ASTRINGTOTEST";
title.Contains("string");

似乎没有一个过载允许我设置区分大小写。目前我大写它们两个,但这只是愚蠢(我指的是上下套管带来的i18n问题)。

UPDATE
这个问题是古老的,从那时起我就意识到,如果你想完全研究它,我会要求一个简单的答案来解决一个非常庞大而困难的话题。
对于大多数情况,在单语言的英语代码库中, this答案就足够了。 我怀疑是因为大多数人来到这个类别这是最受欢迎的答案。
然而, This答案提出了一个固有的问题,即我们无法比较文本不区分大小写,直到我们知道两个文本是相同的文化并且我们知道文化是什么。 这可能是一个不太受欢迎的答案,但我认为它更正确,这就是为什么我这样标记它。




您可以像这样使用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。




您可以先将字符串向上或向下翻转。

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

哎呀,刚看到最后一点。 不区分大小写的比较*可能*做同样的事情,如果性能不是问题,我认为创建大写副本并比较它们没有问题。 我曾经发誓我曾经看过一次不区分大小写的比较...




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;
    }
}



OrdinalIgnoreCase,CurrentCultureIgnoreCase还是InvariantCultureIgnoreCase?

由于缺少这个,这里有一些关于何时使用哪一个的建议:

DOS

  • 使用StringComparison.OrdinalIgnoreCase进行比较,作为与文化无关的字符串匹配的安全默认值。
  • 使用StringComparison.OrdinalIgnoreCase比较可以提高速度。
  • 在向用户显示输出时,请使用StringComparison.CurrentCulture-based字符串操作。
  • 切换当前使用基于不变文化的字符串操作,以便在比较时使用非语言StringComparison.OrdinalStringComparison.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.aspxhttp://msdn.microsoft.com/en-us/library/ms973919.aspx




如果你关心国际化(或者你可以重新实现它),VisualBasic程序InStr方法是最好的。 在它看来dotNeetPeek显示它不仅占大写字母和小写字母,而且还包括假名类型和全长与半宽字符(主要与亚洲语言相关,尽管罗马字母也有全宽版本) )。 我正在跳过一些细节,但请查看私有方法InternalInStrText

private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
  int num = sSrc == null ? 0 : sSrc.Length;
  if (lStartPos > num || num == 0)
    return -1;
  if (sFind == null || sFind.Length == 0)
    return lStartPos;
  else
    return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}



用这个:

string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);



使用RegEx是一种直接的方法:

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);



这些是最简单的解决方案。

  1. 按索引

    string title = "STRING";
    
    if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
    {
        // contains 
    }
    
  2. 通过改变案例

    string title = "STRING";
    
    bool contains = title.ToLower().Contains("string")
    
  3. 通过正则表达式

    Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
    



您可以使用string.indexof ()函数。 这将不区分大小写




仅限.NET Core 2.0+(截至目前)

从2.0版开始,.NET Core有一对处理这个问题的方法:

  • String.Contains(Char, StringComparison
  • String.Contains(String, StringComparison

例:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

随着时间的推移,他们可能会进入.NET标准,并从那里进入基类库的所有其他实现。




如果你想检查你传递的字符串是否在字符串中,那么有一个简单的方法。

string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";

bool isContaines = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;

This boolean value will return if string contains or not



Related