Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

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]) マッチした文字列
note

String#matchesメソッド
単にマッチングしたかどうかを判定したいだけであれば、String#matchesメソッドの方が簡単です。

Regex2.java(抜粋)

String mail = "sample@examples.com";
System.out.println(mail.matches("[\w\.\-]+@([\w\-]+\.)+[\w\-]+"));
	// 結果:true
正規表現
主な正規表現パターン
Pattern/Matcherクラス
replaceAllメソッド
splitメソッド

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職