0Pricing
Java Academy · レッスン

検索とマッチング

matches、find、lookingAt です。

「検索とマッチング」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

パターンを適用する3つの方法

Matcherには、基本的なテスト方法が3つあります。

  • matches()は入力全体が一致することを要求します。
  • lookingAt()は先頭で一致することを要求します。
  • find()はどこかにある一致を検索します。
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("42");
        System.out.println(m.matches());
    }
}

matches:入力全体

matchesは、両端にアンカーがあるかのように、文字列全体がパターンに適合する場合にのみtrueを返します。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("123").matches());
        System.out.println(p.matcher("123abc").matches());
    }
}

lookingAt:先頭での一致

lookingAtは、入力が一致する文字列で始まっていれば成功します。残りの部分が一致していなくても構いません。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("123abc").lookingAt());
        System.out.println(p.matcher("abc123").lookingAt());
    }
}

find:どこでも一致

findは次の一致を求めて前方に検索します。現在位置以降に一致が存在すればtrueを返します。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("abc123def").find());
    }
}

findによるすべての一致の反復

ループ内でfindを呼び出すと、入力内のすべての一致を順に処理できます。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1bb22ccc333");
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

一致位置:startとend

一致に成功した後、start()とend()はインデックスの範囲を示し、group()は一致したテキストを返します。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("abc123");
        if (m.find()) {
            System.out.println(m.group() + " at [" + m.start() + "," + m.end() + ")");
        }
    }
}

findでのアンカー

アンカー^と$を使うと、findを先頭・末尾のチェックのように動作させられます。ここでの^\d+は、完全な先頭にある数字にのみ一致します。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^\\d+");
        System.out.println(p.matcher("123abc").find());
        System.out.println(p.matcher("abc123").find());
    }
}

Matcherのリセット

reset()はMatcherを先頭に戻すため、同じ入力をもう一度検索できます。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("a").matcher("aaa");
        int first = 0;
        while (m.find()) first++;
        m.reset();
        int second = 0;
        while (m.find()) second++;
        System.out.println(first + " " + second);
    }
}

新しい入力でMatcherを再利用する

reset(newInput)は同じMatcherオブジェクトを別の文字列で再利用するため、新たに割り当てる必要がありません。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("abc");
        m.reset("xyz789");
        System.out.println(m.find());
        System.out.println(m.group());
    }
}

matchesとfindのまとめ

目的に応じて使い分けます。値全体(ID全体など)を検証するにはmatchesを使用し、より大きなテキスト内から一部を抽出または検索するにはfindを使用します。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern id = Pattern.compile("[A-Z]{2}\\d{4}");
        System.out.println(id.matcher("AB1234").matches());
        System.out.println(id.matcher("id=AB1234;").find());
    }
}

一致数のカウント

よくある処理の1つが出現回数のカウントです。findをループし、カウンターを増やします。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("o").matcher("foo boo zoo");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

クイックチェック

入力文字列全体がパターンに一致することを要求するメソッドはどれですか。

まとめ

一致を検索しました。

  • matchesは入力全体をテストし、lookingAtは先頭をテストし、findはどこにでもある一致を検索します。
  • findをループしてすべての一致を反復処理し、group、start、endを読み取ります。
  • resetは先頭に戻し、reset(input)は新しいテキストでMatcherを再利用します。

よくある質問

「検索とマッチング」レッスンは無料ですか?

はい。「検索とマッチング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「検索とマッチング」で何を学びますか?

matches、find、lookingAt です。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「検索とマッチング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パターンのコンパイル
  2. 検索とマッチング
  3. キャプチャグループ
  4. 正規表現による置換
← Java Academyに戻る