Можно ли определить, содержит ли строка String str1="ABCDEFGHIJKLMNOP"
шаблон строки strptrn="gHi"
? Я хотел знать, возможно ли это, когда символы нечувствительны к регистру. Если да, то как?
Строка содержит - игнорировать регистр
Ответ 1
Вы можете использовать
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
: if true, игнорирует случай при сравнении символов.
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;
}
Ответ 2
Если вы не пойдете с регулярным выражением:
"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
Ответ 3
Вы можете использовать java.util.regex.Pattern с флагом CASE_INSENSITIVE для нечувствительности к регистру:
Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
Ответ 4
Попробуйте это
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());
}
}
Ответ 5
Оптимизированная версия Imran Tariq
Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();
Pattern.quote(strptrn) всегда возвращает "\ Q" + s + "\ E", даже если нечего цитировать, concatination портит производительность.