1. 概要

文字列に部分文字列が含まれているかどうかを確認する方法はたくさんあります。 この記事では、Javaの String.contains()に対する大文字と小文字を区別しない回避策に焦点を当てながら、String内のサブストリングを探します。 最も重要なことは、この問題を解決する方法の例を提供することです。

2. 最も簡単な解決策: String.toLowerCase

最も簡単な解決策は、 String.toLowerCase()を使用することです。 この場合、両方の文字列を小文字に変換してから、 contains()メソッドを使用します。

assertTrue(src.toLowerCase().contains(dest.toLowerCase()));

String.toUpperCase()を使用することもでき、同じ結果が得られます。

3. String.matches正規表現を使用

別のオプションは、正規表現で String.matches()を使用することです。

assertTrue(src.matches("(?i).*" + dest + ".*"));

matches()メソッドは、正規表現を表すためにS tringを取ります。 (?i)は、大文字と小文字を区別しないおよびを有効にします。* は、改行を除くすべての文字を使用します。

4. String.regionMatches

String.regionMatches()を使用することもできます。 ignoreCaseパラメーターにtrueを使用して、2つのString領域が一致するかどうかを確認します。

public static boolean processRegionMatches(String src, String dest) {
    for (int i = src.length() - dest.length(); i >= 0; i--) 
        if (src.regionMatches(true, i, dest, 0, dest.length())) 
            return true; 
    return false;
}
assertTrue(processRegionMatches(src, dest));

パフォーマンスを向上させるために、宛先Stringの長さを考慮してリージョンのマッチングを開始します。 次に、イテレータを減らします。

5. パターンCASE_INSENSITIVEオプションを使用

java.util.regex.Pattern クラスは、 matcher()メソッドを使用して文字列を照合する方法を提供します。 この場合、 quote()メソッドを使用して特殊文字をエスケープし、CASE_INSENSITIVEフラグを使用できます。 見てみましょう:

assertTrue(Pattern.compile(Pattern.quote(dest), Pattern.CASE_INSENSITIVE)
    .matcher(src)
    .find());

6. Apache Commons StringUtils.containsIgnoreCase

最後に、 ApacheCommonsStringUtilsクラスを利用します。

assertTrue(StringUtils.containsIgnoreCase(src, dest));

7. パフォーマンスの比較

containsメソッドを使用したサブストリングのチェックに関するこの一般記事のように、オープンソースフレームワーク Java Microbenchmark Harness (JMH)を使用してのメソッドのパフォーマンスを比較しました。ナノ秒

  1. パターンCASE_INSENSITIVE正規表現:399.387 ns
  2. String toLowerCase :434.064 ns
  3. Apache Commons StringUtils :496.313 ns
  4. 文字列領域の一致:718.842 ns
  5. 文字列は正規表現と一致します:3964.346 ns

ご覧のとおり、勝者は Pattern で、 CASE_INSENSITIVE フラグが有効になっており、その直後に toLowerCase()が続きます。 また、Java8とJava11の間でパフォーマンスが明らかに向上していることにも気づきました。

8. 結論

このチュートリアルでは、Javaの場合を無視して、Stringでサブストリングをチェックするいくつかの異なる方法を検討しました。

String.toLowerCase()および toUpperCase() String.matches() String.regionMatches()、 Apache Commons StringUtils.containsIgnoreCase()、および Pattern.matcher()。find()

また、各ソリューションのパフォーマンスを評価したところ、 java.util.regex.Patterncompile()メソッドをCASE_INSENSITIVEフラグとともに使用すると最高の

いつものように、コードはGitHubから入手できます。