如何使用`string.startsWith()`方法忽略大小写?


114

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

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

我该如何实现?


5
没有理由解决这个问题。无论如何,最好的解决方案是使用string.regionMatches(true, 0, prefix, 0, prefix.length());不会导致“标准化”两个字符串的成本的方法。
isapir '16

@AlexanderAbakumov我很好。正确的答案发布在我上面的评论中。它比更改字符串的大小写要有效得多。最好将其升级为答案而不是评论。
isapir '18 -10-9

Answers:


98

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


7
这里最大的问题是性能。对于小字符串,没问题,但是如果您有一个大字符串,...我的意思是...您真的会在1mb的字符串中执行toUpperCase来比较4-10个初始字符吗?
Dyorgio '16

4
嗡嗡声,即使我看不到为什么我想比较1mb字符串的开始部分,然后如果只有4-10个初始字符引起我兴趣,我会使用子字符串,然后归一化并完成...
Nemesis

3
该答案(以及此处找到的所有其他答案)是错误的。如果你看的实施String.equalsIgnoreCase(),你会发现,你需要比较两个小写字母和字符串的大写版本中,你最终能回来之前false。有关替代答案,请参见stackoverflow.com/a/38947571/14731
吉利

10
这个答案是不正确的,因为toLowerCase()在内部使用Locale.getDefault()来更改字符,这可能导致假阴性。假设您要比较“伊斯坦布尔”和“伊斯坦布尔”。在土耳其语中,“İ”的小写字母等于“ı”。因此,当我尝试执行此操作"İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(在Locale.Turkish环境中)时,这会给我带来错误。
Mustafa Berkay Mutlu,

1
@Nemesis,此答案是错误的,将其作为公认的答案可能会误导许多人。您能否编辑答案并链接到Rohit Jain答案。
全能的骆驼Moha

87

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

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

错了 参见:https : //stackoverflow.com/a/15518878/14731


另一个选择是使用String#regionMatches()method,该方法带有一个布尔参数,指出是否进行区分大小写的匹配。您可以像这样使用它:

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

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


如果仅是Regex的忠实拥护者,则可以执行以下操作:

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

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


1
实际上,假设有一个表包含超过10万个条目,并且我在特定列上使用了for循环来解析所有这些条目,在这种情况下,我尝试使用上面的小写选项搜索以特定模式开头的条目。因此,这会导致性能问题。如果根本找不到匹配项,则它将在内部解析所有条目,这将花费大量时间,同时还将其转换为小写字母。那么,还有其他选择可以解决性能问题吗?
Sheetal Bhatewara

@Rohit Jain,实际上这 System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));是一个不恰当的解决方案。您可以尝试以下操作: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));使用vm参数-Duser.country=TR -Duser.language=tr 在本示例中,这I是大写字母i
DPM,


2

试试这个,

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


0

我知道我来晚了,但是从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>


-1

与toLowerCase一起使用

像这样

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.