【问题标题】:How to test for Case-Insensitive StringA.Contains(StringB)? [duplicate]如何测试不区分大小写的 StringA.Contains(StringB)? [复制]
【发布时间】:2013-03-10 14:28:06
【问题描述】:

如何测试子字符串是否包含在其他字符串中,但不区分大小写?

string1.Contains(string2) 不区分大小写。如果没有现有的方法,我想写一个优化的方法,有什么指针吗?

编辑:它也应该适用于全球化。

【问题讨论】:

    标签: c# string


    【解决方案1】:

    您可以在执行检查之前将两个字符串都转换为大写:

    string1.ToUpperInvariant().Contains(string2.ToUpperInvariant())
    

    或者,如果您想在定义不区分大小写时考虑当前文化:

    string1.ToUpper().Contains(string2.ToUpper())
    

    或者您甚至可以通过调用接受CultureInfoToUpper 重载来使用特定的文化。

    code analysis warning CA1308: Normalize strings to uppercase 中描述了您应该转换为大写而不是小写的原因:

    字符串应该被规范化为大写。一小部分字符在转换为小写时不能往返。往返意味着将字符从一种语言环境转换到另一种以不同方式表示字符数据的语言环境,然后从转换后的字符中准确地检索出原始字符。

    您可能想知道哪些“小字符组”受此影响,显然至少一些格鲁吉亚文字根据Michael S. Kaplan 存在此问题。

    【讨论】:

    • 然而,这会有点文化不敏感。我们不知道这是所需的比较类型。
    • @JonSkeet 什么是文化不敏感?是否与全球化支持有关?
    • @ay89:是的。根据他们的文化,不同的字符串将以不区分大小写的方式对不同的人“相等”。查找“土耳其测试”以获取特别棘手的示例。
    • 这里,.ToUpperVariant() 和 ToUpper(CultureInfo) 之间的区别是什么?
    • @ay89: ToUpperInvariant 使用基于“en-US”文化的不变文化 (CultureInfo.InvariantCulture) 转换为大写。大写字母 i 将导致 I。正如 Soner Gönül 所指出的,使用 ToUpper(CultureInfo.GetCultureInfo("tr-TR")) 将导致 İ(土耳其大写加点 I)。
    【解决方案2】:

    使用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
    }
    

    【讨论】:

      【解决方案3】:
      string1.ToUpper().Contains(string2.ToUpper())
      

      【讨论】:

      【解决方案4】:

      你可以使用String.IndexOf Method (String, StringComparison)这个重载

      对于StringComparison.InvariantCultureIgnoreCase

      使用文化敏感的排序规则比较字符串,不变量 文化,并忽略正在比较的字符串的大小写。

      string string1 = "YOURSTRING";
      bool containsornot = string1 .IndexOf("yourstring", StringComparison.InvariantCultureIgnoreCase) >= 0;
      

      这是DEMO

      【讨论】:

        【解决方案5】:

        你试过string1.IndexOf(string2, StringComparison.InvariantCultureIgnoreCase)

        或使用 StringComparison.OrdinalIgnoreCase

        click here for more info

        【讨论】:

        猜你喜欢
        • 2013-07-07
        • 2021-04-12
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2013-03-06
        • 2011-10-14
        • 2013-01-27
        相关资源
        最近更新 更多