【发布时间】:2012-12-10 16:57:26
【问题描述】:
是否可以确定字符串str1="ABCDEFGHIJKLMNOP" 是否包含字符串模式strptrn="gHi"?我想知道当字符不区分大小写时这是否可能。如果有,怎么做?
【问题讨论】:
标签: java string contains case-insensitive
是否可以确定字符串str1="ABCDEFGHIJKLMNOP" 是否包含字符串模式strptrn="gHi"?我想知道当字符不区分大小写时这是否可能。如果有,怎么做?
【问题讨论】:
标签: java string contains case-insensitive
你可以使用
org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
CharSequence searchStr);
检查 CharSequence 是否包含搜索 CharSequence 案例,处理空值。不区分大小写定义为 String.equalsIgnoreCase(String)。
null CharSequence 将返回 false。
这个会比正则表达式更好,因为正则表达式在性能方面总是很昂贵。
官方文档请参考:StringUtils.containsIgnoreCase
更新:
如果你是其中的一员
regex/Pattern 的解决方案,toLowerCase创建额外的字符串对象,您可以使用java.lang.String.regionMatches 实现您自己的自定义containsIgnoreCase
public boolean regionMatches(boolean ignoreCase,
int toffset,
String other,
int ooffset,
int len)
ignoreCase : 如果为真,则在比较字符时忽略大小写。
public static boolean containsIgnoreCase(String str, String searchStr) {
if(str == null || searchStr == null) return false;
final int length = searchStr.length();
if (length == 0)
return true;
for (int i = str.length() - length; i >= 0; i--) {
if (str.regionMatches(true, i, searchStr, 0, length))
return true;
}
return false;
}
【讨论】:
如果你不使用正则表达式:
"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
【讨论】:
Strings
if (file.getName().toLowerCase() .contains(editText.getText().toString().toLowerCase()))
您可以使用带有 CASE_INSENSITIVE 标志的 java.util.regex.Pattern 进行不区分大小写的匹配:
Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
【讨论】:
试试这个
public static void main(String[] args)
{
String original = "ABCDEFGHIJKLMNOPQ";
String tobeChecked = "GHi";
System.out.println(containsString(original, tobeChecked, true));
System.out.println(containsString(original, tobeChecked, false));
}
public static boolean containsString(String original, String tobeChecked, boolean caseSensitive)
{
if (caseSensitive)
{
return original.contains(tobeChecked);
}
else
{
return original.toLowerCase().contains(tobeChecked.toLowerCase());
}
}
【讨论】:
优化的 Imran Tariq 版本
Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();
Pattern.quote(strptrn) 总是返回 "\Q" + s + "\E" 即使没有什么要引用的,连接会破坏性能。
【讨论】: