【问题标题】:How to use `string.startsWith()` method ignoring the case?如何使用`string.startsWith()`方法忽略大小写?
【发布时间】:2013-10-09 20:26:45
【问题描述】:

我想使用string.startsWith() 方法但忽略大小写。

假设我有String“Session”并且我在“sEsSi”上使用startsWith,那么它应该返回true

我怎样才能做到这一点?

【问题讨论】:

  • 没有理由结束这个问题。无论如何,最好的解决方案是使用string.regionMatches(true, 0, prefix, 0, prefix.length());,这不会产生“规范化”两个字符串的成本。
  • @AlexanderAbakumov 我很好。正确答案发布在我上面的评论中。它比更改字符串的大小写要有效得多。最好将其升级为答案而不是评论。

标签: java string


【解决方案1】:

在测试之前使用toUpperCase()toLowerCase() 标准化您的字符串。

【讨论】:

  • 这里最大的问题是性能。对于小字符串没问题,但如果你有一个大字符串......我的意思是......你真的会在一个 1mb 字符串中做一个 toUpperCase 来比较 4-10 个初始字符吗?
  • 哼,即使我不明白为什么我想比较一个 1mb 字符串的起始部分,那么如果我只对 4-10 个初始字符感兴趣,我会使用子字符串,然后规范化并完成......
  • 这个答案(以及这里找到的所有其他答案)是错误的。如果您查看String.equalsIgnoreCase() 的实现,您会发现您需要比较 字符串的小写和大写版本,然后才能最终返回false。请参阅stackoverflow.com/a/38947571/14731 以获得替代答案。
  • 这个答案不正确,因为 toLowerCase() 在内部使用 Locale.getDefault() 来更改字符,这可能会导致误报。假设您想将“İstanbul”与“istanbul”进行比较。在土耳其语中,“İ”的小写等效为“ı”。所以当我尝试这样做"İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(在 Locale.Turkish 环境中)时,它会给我错误。
  • @Nemesis,这个答案是错误的,将其作为公认的答案可能会误导很多人。请您编辑您的答案并链接到 Rohit Jain 答案。
【解决方案2】:

一种选择是将它们都转换为小写或大写:

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

这是错误的。见:https://stackoverflow.com/a/15518878/14731


另一个选择是使用String#regionMatches() 方法,它接受一个布尔参数来说明是否进行区分大小写的匹配。你可以这样使用它:

String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5));  // true

它检查从索引0 到长度5needle 区域是否存在于从索引0 到长度5haystack 中。第一个参数是true,表示它会进行不区分大小写的匹配。


如果你是 Regex 的忠实粉丝,你可以这样做:

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));

(?i) 嵌入标志用于忽略大小写匹配。

【讨论】:

  • 实际上,假设有一个表包含超过 10 万个条目,我在特定列上使用 for 循环来解析所有这些条目,并且我尝试使用上面的这个小写选项搜索以特定模式开头的条目。因此,这会导致性能问题。如果根本找不到匹配项,则在内部它将解析所有条目,这将花费大量时间,同时它也会转换为小写字母。那么还有其他选择来解决性能问题吗?
  • @Rohit Jain,实际上:System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase())); 不是一个合适的解决方案。你可以试试这个:System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase())); with vm arguments -Duser.country=TR -Duser.language=tr 在这个例子中,I 是大写的i
【解决方案3】:

我知道我迟到了,但是使用 Apache Commons Lang 3 中的 StringUtils.startsWithIgnoreCase() 怎么样?

例子:

StringUtils.startsWithIgnoreCase(string, "start");

只需将以下依赖项添加到您的 pom.xml 文件中(假设您使用 Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>

【讨论】:

  • 完美——谢谢。这就是我一直在寻找的答案。
【解决方案4】:
myString.toLowerCase().startsWith(starting.toLowerCase());

【讨论】:

    【解决方案5】:

    试试这个,

    String session = "Session";
    if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
    

    【讨论】:

      【解决方案6】:

      您可以使用someString.toUpperCase().startsWith(someOtherString.toUpperCase())

      【讨论】:

        【解决方案7】:

        StartsWith(String value, bool ignoreCase, CultureInfo?culture) 例如:

        string test = "Session";
        bool result = test.StartsWith("sEsSi", true, null);
        Console.WriteLine(result);
        

        要点:在VS中通过右键StartsWith然后“pick definition”可以看到所有的重载方法

        【讨论】:

        • 问题是关于java的。
        【解决方案8】:

        你总是可以的

        "Session".toLowerCase().startsWith("sEsSi".toLowerCase());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-26
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-28
          相关资源
          最近更新 更多