是否可以确定 String 是否str1="ABCDEFGHIJKLMNOP"
包含字符串模式strptrn="gHi"
?我想知道当字符不区分大小写时这是否可能。如果是这样,怎么做?
问问题
364102 次
5 回答
264
您可以使用
org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
CharSequence searchStr);
检查 CharSequence 是否包含搜索 CharSequence,不考虑大小写,处理 null。不区分大小写由 String.equalsIgnoreCase(String) 定义。
空 CharSequence 将返回 false。
这将比正则表达式更好,因为正则表达式在性能方面总是很昂贵。
官方文档参考:StringUtils.containsIgnoreCase
更新 :
如果你是其中之一
- 不想使用 Apache 公共库
- 不想使用基于昂贵
regex/Pattern
的解决方案, - 不想通过使用创建额外的字符串对象
toLowerCase
,
containsIgnoreCase
您可以使用java.lang.String.regionMatches实现自己的自定义
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;
}
于 2012-12-24T07:39:40.103 回答
260
如果您不使用正则表达式:
"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
于 2012-12-24T07:36:42.190 回答
24
您可以使用带有 CASE_INSENSITIVE 标志的 java.util.regex.Pattern 进行不区分大小写的匹配:
Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
于 2012-12-24T07:35:23.047 回答
8
试试这个
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());
}
}
于 2012-12-24T08:04:56.990 回答
2
优化的 Imran Tariq 版本
Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();
Pattern.quote(strptrn) 总是返回 "\Q" + s + "\E" 即使没有什么要引用的,连接会破坏性能。
于 2012-12-24T08:27:36.463 回答