0Pricing
Java Academy · レッスン

パターンのコンパイル

Pattern.compile と Matcher です。

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

Pattern と Matcher の組み合わせ

Java の正規表現は java.util.regex にあります。Pattern はコンパイル済みの正規表現で、Matcher はそのパターンを特定の入力に適用します。

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

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

一度コンパイルして何度も再利用

Pattern.compileは比較的コストがかかります。ループ内で再コンパイルするのではなく、パターンを一度コンパイルし、多くの入力で再利用してください。

import java.util.regex.Pattern;

public class Main {
    static final Pattern DIGITS = Pattern.compile("\\d+");

    public static void main(String[] args) {
        System.out.println(DIGITS.matcher("a1").find());
        System.out.println(DIGITS.matcher("bb").find());
    }
}

Javaでのバックスラッシュのエスケープ

\dのような正規表現トークンにはバックスラッシュが必要ですが、Javaの文字列でもエスケープにバックスラッシュを使います。そのため、ソースコードでは正規表現の\dを表すために\\dと記述します。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern word = Pattern.compile("\\w+");
        System.out.println(word.matcher("hello").matches());
    }
}

Matcherの作成

pattern.matcher(input)はパターンを入力文字列に結び付け、位置を追跡する新しいMatcherを返します。

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("cat");
        Matcher m = p.matcher("the cat sat");
        System.out.println(m.find());
    }
}

Matcherは状態を持つ

Matcherは変更可能な状態(現在位置や最後に一致した結果)を保持します。入力ごとに新しいMatcherを作成し、複数のスレッド間で1つのMatcherを共有しないでください。

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

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

大文字と小文字を区別しないフラグ

compileの第2引数としてフラグを渡します。Pattern.CASE_INSENSITIVEを指定すると、大文字と小文字が区別されません。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        System.out.println(p.matcher("I love JAVA").find());
    }
}

フラグの組み合わせ

ビット単位のOR演算子でフラグを組み合わせます。ここではMULTILINEを追加し、各行でアンカーが一致するようにします。

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
        Matcher m = p.matcher("apple\nApricot");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

static matchesショートカット

Pattern.matches(regex, input)は、パターンのコンパイルとテストを1回の呼び出しで行う簡便なヘルパーです。便利ですが、呼び出すたびに再コンパイルされます。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        System.out.println(Pattern.matches("\\d{3}", "123"));
        System.out.println(Pattern.matches("\\d{3}", "12"));
    }
}

Patternによる分割

コンパイル済みのPatternはsplitで文字列を分割でき、同じコンパイル済み正規表現を効率的に再利用できます。

import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern comma = Pattern.compile("\\s*,\\s*");
        String[] parts = comma.split("a, b ,c,  d");
        System.out.println(Arrays.toString(parts));
    }
}

Patternの確認

pattern()は元の正規表現文字列を返し、flags()は有効なフラグをintとして返します。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
        System.out.println(p.pattern());
        System.out.println(p.flags());
    }
}

無効なパターンは例外をスローする

不正な形式の正規表現はcompile時にPatternSyntaxExceptionをスローするため、早い段階でエラーを捕捉できます。

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class Main {
    public static void main(String[] args) {
        try {
            Pattern.compile("[unclosed");
        } catch (PatternSyntaxException e) {
            System.out.println("Invalid regex");
        }
    }
}

クイックチェック

頻繁に使用する正規表現をstaticなPatternフィールドにコンパイルしておくべきなのはなぜですか。

まとめ

パターンをコンパイルしました。

  • Pattern.compileは再利用可能で不変、かつスレッドセーフなパターンを作成し、matcherはそれを入力に結び付けます。
  • Javaソースでは、正規表現のバックスラッシュを\\としてエスケープします。
  • CASE_INSENSITIVEやMULTILINEなどのフラグは、ビット単位のORで組み合わせます。
  • Matcherは状態を持つため、入力ごとに1つ作成します。

よくある質問

「パターンのコンパイル」レッスンは無料ですか?

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

「パターンのコンパイル」で何を学びますか?

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

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

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

「パターンのコンパイル」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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