検索とマッチング
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パターンのコンパイル
- 検索とマッチング
- キャプチャグループ
- 正規表現による置換