文字列str1="ABCDEFGHIJKLMNOP"
に文字列パターンstrptrn="gHi"
が含まれているかどうかを判断することは可能ですか?大文字と小文字が区別されない場合に、それが可能かどうかを知りたかったのです。もしそうなら、どうですか?
あなたが使用することができます
org.Apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
CharSequence searchStr);
CharSequenceに大文字と小文字の区別なしに検索CharSequenceが含まれているかどうかを調べ、nullを処理します。大文字と小文字の区別は、String.equalsIgnoreCase(String)で定義されています。
NullのCharSequenceはfalseを返します。
regexはパフォーマンスの点で常に高価ですので、これはregexより優れています。
公式ドキュメントについては、 StringUtils.containsIgnoreCase を参照してください。
更新:
あなたが誰かの中にいれば
regex/Pattern
ベースのソリューションを使いたくない、toLowerCase
を使用して追加の文字列オブジェクトを作成したくないJava.lang.String.regionMatches を使用して、独自のカスタムcontainsIgnoreCase
を実装できます。
public boolean regionMatches(boolean ignoreCase,
int toffset,
String other,
int ooffset,
int len)
ignoreCase
: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;
}
正規表現を使わないのなら:
"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".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"を返します。連結するとパフォーマンスが低下します。