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






