注目記事

【Javaコード入門】正規表現_②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
  1. package com.example.mynavi.regex;
  2.  
  3. import java.util.regex.Pattern;
  4.  
  5. public class Regex {
  6.   public static void main(String[] args) {
  7.     var msg = "お問い合わせは、 sample@examples.com 、" +
  8.       "または、examples@mcn.ne.jpまで";
  9.     var p = Pattern.compile(
  10.       "[¥¥w¥¥.¥¥-]+@([¥¥w¥¥-]+¥¥.)+[¥¥w¥¥-]+", Pattern.CASE_INSENSITIVE);
  11.     var m = p.matcher(msg);
  12.     while (m.find()) {
  13.       System.out.println("マッチング位置:" + m.start());
  14.       System.out.println("マッチング終了位置:" + m.end());
  15.       System.out.println("マッチング文字列:" + m.group());
  16.       System.out.println("------------------------------");
  17.     }
  18.   }
  19. }

  1. マッチング位置:9
  2. マッチング終了位置:28
  3. マッチング文字列:sample@examples.com
  4. ------------------------------
  5. マッチング位置:34
  6. マッチング終了位置:52
  7. マッチング文字列: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(抜粋)
  1. var mail = "sample@examples.com";
  2. System.out.println(mail.matches("[¥¥w¥¥.¥¥-]+@([¥¥w¥¥-]+¥¥.)+[¥¥w¥¥-]+"));
  3.     // 結果:true
正規表現_目次
主な正規表現パターン
Pattern/Matcherクラス
replaceAllメソッド
splitメソッド

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。