web-dev-qa-db-ja.com

文字列を含む - 大文字と小文字を区別しない

文字列str1="ABCDEFGHIJKLMNOP"に文字列パターンstrptrn="gHi"が含まれているかどうかを判断することは可能ですか?大文字と小文字が区別されない場合に、それが可能かどうかを知りたかったのです。もしそうなら、どうですか?

150
AlwaysALearner

あなたが使用することができます

org.Apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
                                     CharSequence searchStr);

CharSequenceに大文字と小文字の区別なしに検索CharSequenceが含まれているかどうかを調べ、nullを処理します。大文字と小文字の区別は、String.equalsIgnoreCase(String)で定義されています。

NullのCharSequenceはfalseを返します。

regexはパフォーマンスの点で常に高価ですので、これはregexより優れています。

公式ドキュメントについては、 StringUtils.containsIgnoreCase を参照してください。

更新:

あなたが誰かの中にいれば

  • apache commons libraryを使いたくない
  • 高価な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;
}
221
Rahul

正規表現を使わないのなら:

"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
234
PeterMmm

大文字と小文字を区別しないで一致させるには、CASE_INSENSITIVEフラグを指定してJava.util.regex.Patternを使用できます。

Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
22

これを試して

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());
    }

}
8
Rais Alam

最適化されたImran Tariqのバージョン

Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();

Pattern.quote(strptrn)は、引用符がない場合でも常に "\ Q" + s + "\ E"を返します。連結するとパフォーマンスが低下します。

2