Pattern/Matcherクラス
正規表現を使って文字列を検索する – 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メソッドに検索すべき文字列を渡すことで、正規表現検索を実行できます。
たとえば以下は、与えられた文字列に含まれるメールアドレスを正規表現検索し、その結果をリスト表示する例です。
Regex.java
package com.example.mynavi.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Regex { public static void main(String[] args) { String msg = "お問い合わせは、 sample@examples.com 、" + "または、examples@mcn.ne.jpまで"; Pattern p = Pattern.compile( "[¥¥w¥¥.¥¥-]+@([¥¥w¥¥-]+¥¥.)+[¥¥w¥¥-]+", Pattern.CASE_INSENSITIVE); Matcher 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メソッドの方が簡単です。
Regex2.java(抜粋)
String mail = "sample@examples.com"; System.out.println(mail.matches("[¥¥w¥¥.¥¥-]+@([¥¥w¥¥-]+¥¥.)+[¥¥w¥¥-]+")); // 結果:true