startsWith()方法的字符串忽略大小写

She*_*ara 97 java string

我想使用startsWith()方法,String但忽略了这种情况.

假设我有String"Session"而我startsWith在"sEsSi"上使用它应该返回true.

Nem*_*sis 94

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

  • 这个答案不正确,因为toLowerCase()在内部使用Locale.getDefault()来更改字符,这可能会导致错误否定.假设您要将"伊斯坦布尔"与"伊斯坦布尔"进行比较.在土耳其语"İ"的小写等价物是"ı".所以当我尝试做那个"İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())`(在Locale.Turkish环境中)时,它会给我错误. (8认同)
  • 这里最大的问题是性能.对于小字符串没有问题,但如果你有一个大问题...我的意思是......你真的会在1mb字符串中做一个toUpperCase只是为了比较4-10个正式字符? (4认同)
  • 哼哼即使我不明白我为什么要比较1mb字符串的起始部分然后如果只有4-10个初始字符感兴趣我使用substring然后规范化并完成... (4认同)
  • 这个答案(以及此处发现的所有其他答案)都是错误的.如果你看一下`String.equalsIgnoreCase()`的实现,你会发现你需要比较**的小写和小写的大写版本才能最终返回'false`.有关替代答案,请参见http://stackoverflow.com/a/38947571/14731. (3认同)
  • @Nemesis,这个答案是错误的,将其作为公认的答案可能会误导很多人。请您编辑您的答案并链接到 Rohit Jain 的答案。 (2认同)

Roh*_*ain 82

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

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Run Code Online (Sandbox Code Playgroud)

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

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

它检查的区域是否needle从指数0直到长度5是存在于haystack起始从索引0直到长度5或没有.第一个参数是true,意味着它将进行不区分大小写的匹配.


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

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));
Run Code Online (Sandbox Code Playgroud)

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


Séb*_*mme 10

我知道我迟到了,但是如何使用 Apache Commons Lang 3 中的 StringUtils.startsWithIgnoreCase() 呢?

例子 :

StringUtils.startsWithIgnoreCase(string, "start");
Run Code Online (Sandbox Code Playgroud)

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

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)