文字列の照合

文字列の照合(しょうごう、英: string matching)とは、ある文字列(パターン)が、別の文字列(テキスト)中に出現するかどうかを調べる処理のことを指します。

例えば、"apple" というパターンが、"I like apples and oranges." というテキスト中に出現するかどうかを調べる場合、パターンの各文字をテキストの各文字と比較していき、一致しない箇所があった場合は次の位置から比較を続けます。パターンが見つかった場合は、その開始位置を報告するか、パターンが見つからなかった場合は、見つからなかったことを報告します。以下のサンプルプログラムでは見つからなかった場合は-1を返す仕様になっています。

文字列の照合は、コンピュータサイエンスにおいて基本的かつ重要な問題であり、情報検索、自然言語処理、バイオインフォマティクスなどの分野で広く応用されています。検索エンジン、テキストエディタ、バイオインフォマティクスのソフトウェアなど、多くのアプリケーションで利用されています。

Javaの文字列照合には、Stringクラスに用意されている indexOf() メソッドがあります。このメソッドは、指定された文字列が現れる最初のインデックスを返します。もし文字列が見つからなかった場合は、-1を返します。

String text = "I love programming in Java!";
String pattern = "love";
System.out.println(text.indexOf(pattern));

以下はindexOf() メソッドを模した動作をするプログラムです。

<サンプルプログラム>

public class PatternMatching {
    public static int findMatch(String text, String pattern) {
        int textLength = text.length(); // テキスト文字列の長さを取得
        int patternLength = pattern.length(); // パターン文字列の長さを取得
        for (int i = 0; i <= textLength - patternLength; i++) { // テキスト文字列全体に対してループ処理を行う
            int j;
            for (j = 0; j < patternLength; j++) { // パターン文字列全体に対してループ処理を行う
                if (text.charAt(i + j) != pattern.charAt(j)) { // テキスト文字列とパターン文字列を比較し、一致しない場合はループを終了する
                    break;
                }
            }
            if (j == patternLength) { // パターン文字列全体に対してループ処理が完了し、一致が見つかった場合、テキスト文字列内の開始インデックスを返す
                return i;
            }
        }
        return -1; // 一致が見つからなかった場合、-1を返す
    }

    public static void main(String[] args) {
        String text = "abbdeabcdabc";
        String pattern = "abc";
        int matchIndex = findMatch(text, pattern);
        if (matchIndex != -1) {
            System.out.println("パターン" + pattern + " が " + matchIndex + " 番目の添字以降に見つかりました。 ");
        } else {
            System.out.println("パターン" + pattern + " は見つかりませんでした。");
        }
    }
}

<出力結果>

パターンabc が 5 番目の添字以降に見つかりました。