Regex によるパターンマッチング
CoddyのJavaジャーニー「ロジックとフロー」セクションの一部。レッスン 47/59。
Pattern クラスと Matcher クラスは、Java で正規表現操作を行うための強力なツールを提供します。まず、それらの使い方を理解しましょう。
Pattern.compile() を使用して pattern を作成します:
Pattern pattern = Pattern.compile("cat");
// 「cat」を見つけるパターンを作成しますテキスト用のmatcherを作成します:
String text = "The cat and dog";
Matcher matcher = pattern.matcher(text);
// テキスト用のマッチャーを作成しますこれで、matcher.find() を使って一致する箇所を検索できます:
while (matcher.find()) {
System.out.println("Found at: " + matcher.start());
}上記のコードを実行すると、出力は次のようになります:Found at: 4
メソッドの理解:
matcher.find()- テキスト内でパターンの次の出現箇所を検索します- 一致が見つかった場合は
trueを返します - これ以上一致が存在しない場合は
falseを返します - これが、すべての出現箇所を見つけるために
whileループで使用する理由です
- 一致が見つかった場合は
matcher.start()-find()によって最後に見つかった一致の開始インデックス(位置)を返します- この例では、"cat"は"The cat and dog"のインデックス4から始まります
find()が成功した後に呼び出す必要があります
複数の一致を含む例:
Pattern pattern = Pattern.compile("cat");
Matcher matcher = pattern.matcher("cat and cat");
while (matcher.find()) {
System.out.println("Found at: " + matcher.start());
}
// 出力:
// Found at: 0
// Found at: 8チャレンジ
簡単findWordsという名前のメソッドを作成し、2つの引数を受け取るようにします。
- 検索対象となる String(
text) - 検索する String(
word)
メソッドは次の処理を行う必要があります。
- Pattern と Matcher を使用して、単語のすべての出現箇所を検索する
- 単語が見つかった位置を含む文字列を返す
- 位置はスペースで区切る
返すメッセージは次のとおりです。
- いずれかの入力が null の場合:"Invalid input" を返す
- 単語が見つからない場合:"Not found" を返す
- 見つかった場合:位置を返す(例:"4 10 15")
自分で試してみよう
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static String findWords(String text, String word) {
// ここにコードを書いてください
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String word = scanner.nextLine();
if (text.equals("null")) text = null;
if (word.equals("null")) word = null;
System.out.println(findWords(text, word));
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Javaオンラインコンパイラ
自分のテキストでパターンを試す: 正規表現テスター