【问题标题】:Find a substring in a case-insensitive way - C# [duplicate]以不区分大小写的方式查找子字符串 - C# [重复]
【发布时间】:2012-01-19 15:36:33
【问题描述】:

可能重复:
Case insensitive contains(string)

使用 String 类的Contains() 方法可以找到子字符串。 如何以不区分大小写的方式在字符串中查找子字符串?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以使用 IndexOf() 方法,该方法接受 StringComparison 类型:

    string s = "foobarbaz";
    int index = s.IndexOf("BAR", StringComparison.CurrentCultureIgnoreCase); // index = 3
    

    如果没有找到字符串,IndexOf() 返回 -1。

    【讨论】:

      【解决方案2】:

      如果找到匹配项,则包含返回布尔值。如果要搜索不区分大小写,可以让源字符串和字符串在匹配前同时匹配大写或小写。

      例子:

      if(sourceString.ToUpper().Contains(stringToFind.ToUpper()))
      {
          // string is found
      }
      

      【讨论】:

      • 这会生成两个额外的字符串,每个 ToUpper 一个,这会导致更多的内存使用。最好的方法是使用带有比较器的 IndexOf 重载。
      【解决方案3】:

      stringToSearch.ToLower().Contains(stringToSearchFor.ToLower())

      【讨论】:

      • 这会生成两个额外的字符串,每个 ToLower 一个,这会导致更多的内存使用。最好的方法是使用带有比较器的 IndexOf 重载。
      【解决方案4】:
      string myString = "someTextorMaybeNot";
      myString.ToUpper().Contains( "text".ToUpper() );
      

      【讨论】:

      • 这会生成两个额外的字符串,每个 ToUpper 一个,这会导致更多的内存使用。最好的方法是使用带有比较器的 IndexOf 重载。
      【解决方案5】:

      没有不区分大小写的版本。请改用IndexOf(或正则表达式,尽管不推荐这样做,而且过分了)。

      string string1 = "my string";
      string string2 = "string";
      bool isContained = string1.IndexOf(string2, StringComparison.OrdinalIgnoreCase) >= 0;
      

      StringComparison.OrdinalIgnoreCase 通常用于更多“程序化”文本,例如您可能生成的路径或常量,并且是字符串比较的最快方法。对于语言文本字符串,请使用 StringComparison.CurrentCultureIgnoreCaseStringComparison.InvariantCultureIgnoreCase

      【讨论】:

      • 如果您运行 this 与 OrdinalIgnoreCase 选项的测量命令速度,则 toupper()/tolower().. 将所有字符串转换为小写,然后执行不带 ordinalignorecase 的标准 indexof() ,tolower() 版本在大小字符串上都快了大约 25%。
      • 但是需要更多内存,因为 ToLower/ToUpper 需要为新字符串分配内存。当然,一切都需要考虑在内。
      猜你喜欢
      • 2015-04-22
      • 2014-04-11
      • 1970-01-01
      • 2011-10-26
      • 2012-02-29
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多