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

时间:2009-01-14 21:39:47

标签: c# string contains case-insensitive

有没有办法让以下返回为真?

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

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

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

28 个答案:

答案 0 :(得分:2533)

您可以使用String.IndexOf Method并传递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)以来null propagation ?.可用,旧版本使用

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

用法:

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);

答案 1 :(得分:1244)

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

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

culture是描述文本所用语言的CultureInfo实例。

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

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

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

答案 2 :(得分:216)

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

答案 3 :(得分:129)

使用正则表达式的替代解决方案:

bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);

答案 4 :(得分:72)

您可以随时向上或向下对齐字符串。

string title = "string":
title.ToUpper().Contains("STRING")  // returns true
哎呀,刚看到最后一点。不区分大小写的比较*可能*无论如何都要做同样的事情,如果性能不是问题,我认为创建大写副本并比较它们没有问题。我曾经发誓我曾经看过一次不区分大小写的比较......

答案 5 :(得分:50)

答案的一个问题是,如果字符串为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;
} 

答案 6 :(得分:35)

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

答案 7 :(得分:35)

这很干净简单。

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)

答案 8 :(得分:24)

OrdinalIgnoreCase,CurrentCultureIgnoreCase还是InvariantCultureIgnoreCase?

由于缺少这个,以下是关于何时使用哪一个的一些建议:

待办事项

  • 使用StringComparison.OrdinalIgnoreCase进行比较 作为与文化无关的字符串匹配的安全默认值。
  • 使用StringComparison.OrdinalIgnoreCase比较 提高速度。
  • 使用StringComparison.CurrentCulture-based字符串操作 在向用户显示输出时。
  • 根据不变量切换当前字符串操作的使用 当比较为
    时,文化使用非语言StringComparison.OrdinalStringComparison.OrdinalIgnoreCase 语言上无关紧要(例如,象征性的)。
  • 何时使用ToUpperInvariant而不是ToLowerInvariant 规范化字符串以进行比较。

唐&#39; TS

  • 对不明确的字符串操作使用重载 或隐式指定字符串比较机制。
  • 使用基于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

答案 9 :(得分:16)

仅.NET Core 2.0+(到目前为止)

.NET Core从2.0版开始就有一对方法来解决这个问题:

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

示例:

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

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

答案 10 :(得分:12)

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

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

答案 11 :(得分:10)

我知道这不是C#,但是在框架(VB.NET)中已经存在这样的功能

Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")

C#变种:

string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");

答案 12 :(得分:10)

如果您对国际化有所担忧(或者您可以重新实现),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);
}

答案 13 :(得分:10)

就像这样:

string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
    Console.WriteLine("yes");
}

答案 14 :(得分:9)

您可以使用字符串比较参数(可从 .net 2.1 及更高版本获得)String.Contains Method

public bool Contains (string value, StringComparison comparisonType);

示例:

string title = "ASTRINGTOTEST";
title.Contains("string", StringComparison.InvariantCultureIgnoreCase);

答案 15 :(得分:9)

使用此:

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

答案 16 :(得分:6)

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

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

答案 17 :(得分:5)

这与此处的其他示例非常相似,但我已决定将枚举简化为bool,因为通常不需要其他替代方法。这是我的例子:

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, bool bCaseInsensitive )
    {
        return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0;
    }
}

用法如下:

if( "main String substring".Contains("SUBSTRING", true) )
....

答案 18 :(得分:2)

这里的技巧是寻找字符串,忽略大小写,但保持完全相同(使用相同的情况)。

 var s="Factory Reset";
 var txt="reset";
 int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length;
 var subString = s.Substring(first - txt.Length, txt.Length);

输出为“重置”

答案 19 :(得分:2)

if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}

答案 20 :(得分:2)

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

答案 21 :(得分:2)

类似于先前的答案(使用扩展方法),但具有两个简单的null检查(C#6.0及更高版本):

public static bool ContainsIgnoreCase(this string source, string substring)
{
    return source?.IndexOf(substring ?? "", StringComparison.OrdinalIgnoreCase) >= 0;
}

如果source为null,则返回false(通过null传播运算符?。)

如果子字符串为null,则将其视为空字符串并返回true(通过null运算符??)

如果需要,当然可以将StringComparison作为参数发送。

答案 22 :(得分:0)

public static class StringExtension
{
    #region Public Methods

    public static bool ExContains(this string fullText, string value)
    {
        return ExIndexOf(fullText, value) > -1;
    }

    public static bool ExEquals(this string text, string textToCompare)
    {
        return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExHasAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index]) == false) return false;
        return true;
    }

    public static bool ExHasEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return true;
        return false;
    }

    public static bool ExHasNoEquals(this string text, params string[] textArgs)
    {
        return ExHasEquals(text, textArgs) == false;
    }

    public static bool ExHasNotAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return false;
        return true;
    }

    /// <summary>
    /// Reports the zero-based index of the first occurrence of the specified string
    /// in the current System.String object using StringComparison.InvariantCultureIgnoreCase.
    /// A parameter specifies the type of search to use for the specified string.
    /// </summary>
    /// <param name="fullText">
    /// The string to search inside.
    /// </param>
    /// <param name="value">
    /// The string to seek.
    /// </param>
    /// <returns>
    /// The index position of the value parameter if that string is found, or -1 if it
    /// is not. If value is System.String.Empty, the return value is 0.
    /// </returns>
    /// <exception cref="ArgumentNullException">
    /// fullText or value is null.
    /// </exception>
    public static int ExIndexOf(this string fullText, string value)
    {
        return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExNotEquals(this string text, string textToCompare)
    {
        return ExEquals(text, textToCompare) == false;
    }

    #endregion Public Methods
}

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

仅基于此处的答案,您可以创建一个字符串扩展方法以使其更加用户友好:

    public static bool ContainsIgnoreCase(this string paragraph, string word)
    {
        return new CultureInfo("en-US").CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
    }

答案 25 :(得分:0)

简单而有效

title.ToLower().Contains("String".ToLower())

答案 26 :(得分:0)

根据现有的答案和Contains方法的文档,我建议创建以下扩展名,该扩展名还应注意一些特殊情况:

public static class VStringExtensions 
{
    public static bool Contains(this string source, string toCheck, StringComparison comp) 
    {
        if (toCheck == null) 
        {
            throw new ArgumentNullException(nameof(toCheck));
        }

        if (source.Equals(string.Empty)) 
        {
            return false;
        }

        if (toCheck.Equals(string.Empty)) 
        {
            return true;
        }

        return source.IndexOf(toCheck, comp) >= 0;
    }
}

答案 27 :(得分:-4)

新手的简单方法:

title.ToLower().Contains("string");//of course "string" is lowercase.