[Java] containsメソッドで文字列の部分一致判定を行う方法

JavaのStringクラスには、部分一致を判定するためのcontainsメソッドが用意されています。

このメソッドは、指定した文字列が対象の文字列に含まれているかどうかを判定し、含まれていればtrue、含まれていなければfalseを返します。

使用方法は、対象文字列.contains(検索文字列)の形式です。

大文字・小文字の区別は行われるため、無視したい場合はtoLowerCase()toUpperCase()を併用します。

この記事でわかること
  • containsメソッドの基本的な使い方
  • 大文字・小文字の区別について
  • 複数の文字列の判定方法
  • 正規表現との違い
  • エラーの原因と対策方法

目次から探す

containsメソッドを使った文字列の部分一致判定

Javaのcontainsメソッドは、文字列が特定の部分文字列を含んでいるかどうかを判定するために使用されます。

このメソッドは、Stringクラスの一部であり、非常に便利な機能です。

以下では、containsメソッドの基本的な使い方や、さまざまなケースについて解説します。

文字列の部分一致を判定する基本例

以下のサンプルコードでは、containsメソッドを使って文字列が特定の部分文字列を含むかどうかを判定します。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = "プログラミング";
        // containsメソッドを使用して部分一致を判定
        boolean result = text.contains(searchString);
        
        System.out.println("部分一致の判定結果: " + result);
    }
}
部分一致の判定結果: true

この例では、textに「プログラミング」という部分文字列が含まれているため、containsメソッドtrueを返します。

大文字・小文字を区別した部分一致

containsメソッドは、大文字と小文字を区別します。

以下のコードでは、その挙動を示します。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = "java"; // 小文字の"java"
        // containsメソッドを使用して部分一致を判定
        boolean result = text.contains(searchString);
        
        System.out.println("部分一致の判定結果: " + result);
    }
}
部分一致の判定結果: false

この場合、小文字の java は大文字の Java と一致しないため、falseが返されます。

大文字・小文字を無視した部分一致

大文字・小文字を無視して部分一致を判定したい場合は、文字列をすべて小文字または大文字に変換してから判定します。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = "java"; // 小文字の"java"
        // 文字列を小文字に変換してからcontainsメソッドを使用
        boolean result = text.toLowerCase().contains(searchString.toLowerCase());
        
        System.out.println("部分一致の判定結果: " + result);
    }
}
部分一致の判定結果: true

このように、両方の文字列を小文字に変換することで、大文字・小文字を無視した判定が可能になります。

空文字列を検索した場合の挙動

空文字列を検索した場合、containsメソッドは常にtrueを返します。

これは、任意の文字列は空文字列を含むとみなされるためです。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = ""; // 空文字列
        // containsメソッドを使用して部分一致を判定
        boolean result = text.contains(searchString);
        
        System.out.println("部分一致の判定結果: " + result);
    }
}
部分一致の判定結果: true

nullを検索した場合の挙動

containsメソッドnullを渡すと、NullPointerExceptionが発生します。

これは、nullは文字列ではないためです。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = null; // nullを検索
        try {
            // containsメソッドを使用して部分一致を判定
            boolean result = text.contains(searchString);
            System.out.println("部分一致の判定結果: " + result);
        } catch (NullPointerException e) {
            System.out.println("エラー: nullを検索することはできません。");
        }
    }
}
エラー: nullを検索することはできません。

このように、nullを渡すとエラーが発生するため、事前にチェックすることが重要です。

containsメソッドの応用例

containsメソッドは、文字列の部分一致判定だけでなく、さまざまな場面で応用することができます。

以下では、いくつかの具体的な応用例を紹介します。

複数の文字列を含むかどうかの判定

複数の文字列が含まれているかを判定するには、containsメソッドを組み合わせて使用します。

以下のコードでは、2つの文字列が両方とも含まれているかを確認します。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString1 = "Java";
        String searchString2 = "楽しい";
        // 両方の文字列が含まれているかを判定
        boolean result = text.contains(searchString1) && text.contains(searchString2);
        
        System.out.println("両方の部分一致の判定結果: " + result);
    }
}
両方の部分一致の判定結果: true

この例では、両方の文字列が含まれているため、trueが返されます。

正規表現を使った部分一致判定との違い

containsメソッドは単純な部分一致を判定しますが、正規表現を使うことでより複雑なパターンマッチングが可能です。

以下のコードでは、正規表現を使った部分一致の例を示します。

import java.util.regex.Pattern;
public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String regex = "Java.*楽しい"; // "Java"から"楽しい"までの任意の文字列
        // 正規表現を使用して部分一致を判定
        boolean result = Pattern.matches(regex, text);
        
        System.out.println("正規表現による部分一致の判定結果: " + result);
    }
}
正規表現による部分一致の判定結果: true

このように、正規表現を使うことで、より柔軟な条件での部分一致判定が可能になります。

特定の文字列が含まれているかを条件にした処理分岐

containsメソッドを使って、特定の文字列が含まれているかどうかで処理を分岐させることができます。

以下のコードでは、特定の文字列が含まれている場合に異なるメッセージを表示します。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = "楽しい";
        // 特定の文字列が含まれているかで処理を分岐
        if (text.contains(searchString)) {
            System.out.println("この文章は楽しい内容を含んでいます。");
        } else {
            System.out.println("楽しい内容は含まれていません。");
        }
    }
}
この文章は楽しい内容を含んでいます。

このように、containsメソッドを使うことで、条件に応じた処理を簡単に実装できます。

リストや配列内の文字列に対するcontainsの利用

containsメソッドは、リストや配列内の文字列に対しても利用できます。

以下のコードでは、文字列のリストに特定の文字列が含まれているかを判定します。

import java.util.ArrayList;
import java.util.List;
public class App {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("Java");
        stringList.add("Python");
        stringList.add("C++");
        String searchString = "Python";
        // リスト内に特定の文字列が含まれているかを判定
        boolean result = stringList.contains(searchString);
        
        System.out.println("リスト内に含まれているか: " + result);
    }
}
リスト内に含まれているか: true

このように、containsメソッドを使うことで、コレクション内の要素の存在を簡単に確認できます。

containsメソッドを使ったフィルタリング処理

containsメソッドを使って、特定の条件に基づいて文字列をフィルタリングすることも可能です。

以下のコードでは、特定の文字列を含む要素だけを抽出します。

import java.util.ArrayList;
import java.util.List;
public class App {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("Javaプログラミング");
        stringList.add("Pythonプログラミング");
        stringList.add("C++プログラミング");
        String searchString = "Java";
        List<String> filteredList = new ArrayList<>();
        // containsメソッドを使ってフィルタリング
        for (String str : stringList) {
            if (str.contains(searchString)) {
                filteredList.add(str);
            }
        }
        System.out.println("フィルタリング結果: " + filteredList);
    }
}
フィルタリング結果: [Javaプログラミング]

このように、containsメソッドを利用することで、特定の条件に合致する要素を簡単に抽出することができます。

よくあるエラーとその対処法

containsメソッドを使用する際には、いくつかのエラーや注意点があります。

以下では、よくあるエラーとその対処法について解説します。

NullPointerExceptionが発生する原因と対策

containsメソッドnullを渡すと、NullPointerExceptionが発生します。

これは、nullは文字列ではないため、メソッドが正常に動作しないからです。

以下のコードは、nullを渡した場合の例です。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = null; // nullを検索
        try {
            // containsメソッドを使用して部分一致を判定
            boolean result = text.contains(searchString);
            System.out.println("部分一致の判定結果: " + result);
        } catch (NullPointerException e) {
            System.out.println("エラー: nullを検索することはできません。");
        }
    }
}
エラー: nullを検索することはできません。

対策: containsメソッドを呼び出す前に、searchStringnullでないことを確認することが重要です。

以下のように、条件分岐を使ってチェックできます。

if (searchString != null && text.contains(searchString)) {
    // 処理
}

大文字・小文字の区別による誤判定

containsメソッドは、大文字と小文字を区別します。

そのため、同じ単語でも大文字と小文字が異なる場合、部分一致として判定されません。

以下の例を見てみましょう。

public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String searchString = "java"; // 小文字の"java"
        // containsメソッドを使用して部分一致を判定
        boolean result = text.contains(searchString);
        
        System.out.println("部分一致の判定結果: " + result);
    }
}
部分一致の判定結果: false

対策: 大文字・小文字を無視して判定したい場合は、文字列をすべて小文字または大文字に変換してから判定します。

boolean result = text.toLowerCase().contains(searchString.toLowerCase());

containsメソッドのパフォーマンスに関する注意点

containsメソッドは、文字列の長さに応じてパフォーマンスが影響を受けることがあります。

特に、大きな文字列に対して頻繁に呼び出す場合、パフォーマンスが低下する可能性があります。

以下の点に注意が必要です。

  • 長い文字列: 検索対象の文字列が非常に長い場合、containsメソッドの実行時間が増加します。
  • 頻繁な呼び出し: 同じ文字列に対して何度もcontainsメソッドを呼び出す場合、結果をキャッシュすることを検討してください。

対策: パフォーマンスが重要な場合は、以下のような方法を検討できます。

  • 文字列の事前処理: 検索対象の文字列を事前に処理しておくことで、検索を効率化します。
  • データ構造の選択: 文字列の検索が頻繁に行われる場合、SetMapなどのデータ構造を使用して、検索を高速化することができます。

これらの注意点を考慮することで、containsメソッドをより効果的に利用することができます。

よくある質問

containsメソッドは大文字・小文字を区別しますか?

はい、containsメソッドは大文字と小文字を区別します。

つまり、例えば Java という文字列は java とは異なるものとして扱われます。

そのため、部分一致を判定する際には、大文字・小文字の違いに注意が必要です。

大文字・小文字を無視して判定したい場合は、両方の文字列を小文字または大文字に変換してからcontainsメソッドを使用することをお勧めします。

containsメソッドで部分一致が見つからない場合、どうすればいいですか?

containsメソッドで部分一致が見つからない場合、以下の点を確認してください。

  • 文字列の正確性: 検索対象の文字列が正確であるか確認します。

スペースや特殊文字が含まれていないかもチェックしましょう。

  • 大文字・小文字の違い: 大文字と小文字の違いが原因で一致しない場合があります。

必要に応じて、文字列を小文字または大文字に変換してから判定します。

  • 空文字列やnullの確認: 検索対象が空文字列やnullでないことを確認します。

空文字列は常に一致しますが、nullを渡すとNullPointerExceptionが発生します。

containsメソッドは正規表現をサポートしていますか?

containsメソッド自体は正規表現をサポートしていません。

containsは単純な部分一致を判定するためのメソッドです。

正規表現を使用したい場合は、PatternクラスMatcherクラスを利用する必要があります。

正規表現を使うことで、より複雑なパターンマッチングが可能になります。

以下は、正規表現を使った部分一致の例です。

import java.util.regex.Pattern;
public class App {
    public static void main(String[] args) {
        String text = "Javaプログラミングは楽しい";
        String regex = "Java.*楽しい"; // "Java"から"楽しい"までの任意の文字列
        // 正規表現を使用して部分一致を判定
        boolean result = Pattern.matches(regex, text);
        
        System.out.println("正規表現による部分一致の判定結果: " + result);
    }
}

このように、正規表現を使うことで、より柔軟な条件での部分一致判定が可能になります。

まとめ

この記事では、Javaのcontainsメソッドを使用した文字列の部分一致判定について、基本的な使い方から応用例、よくあるエラーとその対策まで幅広く解説しました。

特に、containsメソッドの大文字・小文字の区別や、複数の文字列を含むかどうかの判定、正規表現との違いについても触れました。

これらの知識を活用して、文字列操作をより効果的に行うためのスキルを身につけてください。

今後は、実際のプロジェクトや課題において、containsメソッドを積極的に活用し、文字列処理の効率を向上させることをお勧めします。

  • URLをコピーしました!
目次から探す