Java 如何使用`string.startsWith()`方法忽略大小写?
我想使用Java 如何使用`string.startsWith()`方法忽略大小写?,java,string,Java,String,我想使用string.startsWith()方法,但忽略大小写 假设我有String“Session”,并且在“Session”上使用startsWith,那么它应该返回true 如何实现这一点?一个选项是将两者转换为小写或大写: "Session".toLowerCase().startsWith("sEsSi".toLowerCase()); 这是错误的。见: 另一种选择是使用方法,该方法使用一个布尔参数,说明是否进行区分大小写的匹配。您可以这样使用它: String haystac
string.startsWith()
方法,但忽略大小写
假设我有String
“Session”,并且在“Session”上使用startsWith
,那么它应该返回true
如何实现这一点?一个选项是将两者转换为小写或大写:
"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
这是错误的。见:
另一种选择是使用方法,该方法使用一个布尔参数,说明是否进行区分大小写的匹配。您可以这样使用它:
String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5)); // true
System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));
它检查从索引0
到长度5
的针区域是否存在于从索引0
到长度5
的干草堆中。第一个参数是true
,表示它将进行不区分大小写的匹配
如果你是正则表达式的忠实粉丝,你可以这样做:
String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5)); // true
System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));
(?i)
嵌入标志用于忽略大小写匹配 试试这个
myString.toLowerCase().startsWith(starting.toLowerCase());
String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
你总能做到
"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
您可以使用someString.toUpperCase().startsWith(somesotherstring.toUpperCase())
使用toUpperCase()
或toLowerCase()
在测试字符串之前对其进行标准化。我知道我迟到了,但是使用Apache Commons Lang 3中的StringUtils.startsWithIgnoreCase()怎么样
例如:
StringUtils.startsWithIgnoreCase(string, "start");
只需将以下依赖项添加到pom.xml文件中(假设您使用Maven):
org.apache.commons
commons-lang3
3.11
事实上,假设有一个表有超过10万个条目,我在特定列上使用for循环来解析所有这些条目,在这一点上,我尝试使用上面的这个小写选项来搜索以特定模式开始的条目。因此,这会导致性能问题。如果根本没有找到匹配项,那么它将在内部解析所有条目,这将花费大量时间,同时它也将转换为小写。那么,还有其他解决性能问题的方法吗?@Rohit Jain,实际上是:System.out.println(“Session.toLowerCase().startsWith(“Session.toLowerCase())代码>不是propper解决方案。您可以尝试这样做:System.out.println(“SessIon.toLowerCase().startsWith(“SessIon.toLowerCase()))代码>带有vm参数-Duser.country=TR-Duser.language=TR
在本例中,I
是大写的I
这里最大的问题是性能。对于小字符串没有问题,但是如果你有一个大字符串。。。我是说。。。你真的会在1mb字符串中使用toUpperCase来比较4-10个独立字符吗?哼,即使我不明白为什么我要比较1mb字符串的起始部分,那么如果我只对4-10个初始字符感兴趣,我会使用子字符串,然后规范化并完成…这个答案(以及本文中找到的所有其他答案)是错误的。如果查看String.equalsIgnoreCase()
的实现,您会发现需要比较字符串的小写和大写版本,然后才能最终返回false
。请参阅以获取替代答案。此答案不正确,因为toLowerCase()在内部使用Locale.getDefault()更改字符,这可能导致误判。比如说,你想把“斯坦布尔”和“伊斯坦布尔”进行比较。在土耳其语中,“İ”的小写等价物是“ı”。因此,当我尝试这样做时,“İstanbul”.toLowerCase().startsWith(“伊斯坦布尔”.toLowerCase())
(在Locale.Turkish环境中),它会给我错误的答案。@Nemesis,这个答案是错误的,把它作为公认的答案可能会误导很多人。请编辑您的答案并链接到Rohit Jain答案。没有理由关闭此问题。无论如何,最好的解决方案是使用string.regionMatches(true,0,prefix,0,prefix.length())代码>这不会产生“规范化”两个字符串的成本。@AlexanderAbakumov我很好。正确的答案张贴在我的评论上面。这比改变字符串的大小写要有效得多。最好升级为一个答案而不是一个评论。