正規表現を使って文字列を検索する – Pattern/Matcherクラス
public static Pattern compile(String regex [,int flags])
public Matcher matcher(CharSequence input)
regex:正規表現
flags:検索オプション
input:入力文字列
正規表現パターンで文字列を検索するには、Pattern/Matcherクラス(java.util.regexパッケージ)を利用します。
まず、Pattern#compileメソッドで正規表現パターン(Patternオブジェクト)を準備します。Petternオブジェクトはnew演算子で直接生成できない点に注意してください。引数flagは検索に際して利用する動作オプションで、以下のような値を指定できます。
| 引数flagsの設定値 | |
|---|---|
| 設定値 | 概要 |
| CASE_INSENSITIVE | 大文字と小文字を区別しない |
| COMMENTS | 空白とコメントを有効化 |
| DOTALL | 改行文字も文字として利用 |
| MULTILINE | 複数行モードを有効化 |
| UNICODE_CASE | Unicodeに準拠した大文字/小文字を区別しないマッチングを有効化 |
| UNIX_LINES | Unixラインモードを有効化(「¥n」だけを行末記号として認識) |
Patternオブジェクトを生成できたら、あとはPattern#matcherメソッドに検索すべき文字列を渡すことで、正規表現検索を実行できます。
たとえば以下は、与えられた文字列に含まれるメールアドレスを正規表現検索し、その結果をリスト表示する例です。
- package com.example.mynavi.regex;
- import java.util.regex.Pattern;
- public class Regex {
- public static void main(String[] args) {
- var msg = "お問い合わせは、 sample@examples.com 、" +
- "または、examples@mcn.ne.jpまで";
- var p = Pattern.compile(
- "[¥¥w¥¥.¥¥-]+@([¥¥w¥¥-]+¥¥.)+[¥¥w¥¥-]+", Pattern.CASE_INSENSITIVE);
- var m = p.matcher(msg);
- while (m.find()) {
- System.out.println("マッチング位置:" + m.start());
- System.out.println("マッチング終了位置:" + m.end());
- System.out.println("マッチング文字列:" + m.group());
- System.out.println("------------------------------");
- }
- }
- }
↓
- マッチング位置:9
- マッチング終了位置:28
- マッチング文字列:sample@examples.com
- ------------------------------
- マッチング位置:34
- マッチング終了位置:52
- マッチング文字列:examples@mcn.ne.jp
検索結果を取得するのは、Matcher#findメソッドの役割です。findメソッドは、次の結果が見つからなかった場合にはfalseを返すので、サンプルでもこれをwhileブロックの終了条件としています。
検索結果は、Matcherオブジェクトの各種メソッドでアクセスできます。以下に、主なものをまとめます。
| Matcherメソッドの主なメソッド | |
|---|---|
| メソッド | 概要 |
| int end([int group]) | 前回のマッチ終了位置(groupはキャプチャグループのインデックス) |
| int start([int group]) | マッチの開始位置 |
| String group([int group]) | マッチした文字列 |
String#matchesメソッド
単にマッチングしたかどうかを判定したいだけであれば、String#matchesメソッドの方が簡単です。
- var mail = "sample@examples.com";
- System.out.println(mail.matches("[¥¥w¥¥.¥¥-]+@([¥¥w¥¥-]+¥¥.)+[¥¥w¥¥-]+"));
- // 結果:true
監修