Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaで正規表現の使い方をご紹介+サンプルプログラム付き

投稿日:2021年1月23日 更新日:

<目次>

(1) Javaで正規表現の使い方をご紹介
 (1-1) 正規表現とは?
 (1-2) Javaでの正規表現の使い方
 (1-3) サンプルプログラム

(1) Javaで正規表現の使い方をご紹介

(1-1) 正規表現とは?

正規表現は部分的なパターンマッチングを行うために非常に便利な仕組みです。

例えば「Boeing777’s first flight was in 1994」という文字列があったとして、そこから「数字3桁」を抜き出したいとします。これは正規表現を使う事で簡単に実現できて「\d{3}」というパターンが「数字3桁」を意味するので「\d{3}の正規表現にマッチする」という条件で探すと文字列中の数字3桁(「777」と「199」)が発見できます。

(図111)

正規表現は奥が深く、組み合わせ次第であらゆるパターンの部分一致照合が可能になりますが、今回は入門編のため、そこについては余り深く触れません(すみません)。代わりといってはなんですが、当記事では「Javaプログラムでの正規表現の使い方」をご紹介いたします。

目次にもどる

(1-2) Javaでの正規表現の使い方

冒頭で例に出した「Boeing777’s first flight was in 1994」という文字列から「数字3桁」を抽出するJavaのプログラムを組む流れをご紹介します。

(1-2-1) STEP1.正規表現の定義

まずは正規表現のパターンをString型で定義します。「数字3桁」は正規表現では「\d{3}」と表現できます。ただし「\」はJavaのエスケープ文字のため、更に前に「\」を付与して「\\d{3}」としています。
 
(STEP1)
String regex= "\\d{3}";

 

目次にもどる

(1-2-2) STEP2.パターンobjectの生成

正規表現を実際に使うためには、正規表現をコンパイルする必要があります。正規表現をコンパイルした結果を「パターンobject」と呼んでおり、正規表現のコンパイルにはPatternクラスを使いますが、このクラスにはpublicのコンストラクタがなく、パターンの作成には「public static compile()」メソッドを使います(Pattern型を返却する)。

(STEP2)

Pattern pattern1 = Pattern.compile(regex);

 

目次にもどる

(1-2-3) STEP3.照合の実行

照合の実行にはMatcherクラスを使います。Matcherクラスは正規表現の照合を行うエンジンであり、パターンに合致する文言の探索を行います。
Patternクラスと同様にpublicのコンストラクタが無いため、代わりにmatcher()メソッドを用いてMatcher型のオブジェクトを生成します。
 
(STEP3)
Matcher matcher1 = pattern1.matcher(word);

 

目次にもどる

(1-2-4) STEP4.照合結果の取得

照合結果の取得はMatcherクラスの各種メソッドを用いて行います。
 
今回はまずwhile文で「次の照合一致がなくなるまで」を条件に、繰り返し処理を実施しています。なので正規表現「\d{3}」にマッチする箇所が7カ所あれば7回繰り返し処理を行います。
 
次に各繰り返し処理の中で、マッチの始点(matcher.start()+1)、マッチの終点(matcher.end()+1)、マッチした文言(matcher.group())を表示しています。始点と終点のインデックスは0から始まるので「XX文字目」とするために+1しています。

//STEP4.照合結果の取得
while (matcher.find()) {
	System.out.print("マッチ開始:"+(matcher.start()+1)+"文字目 ");
	System.out.print("マッチ終了:"+(matcher.end()+1)+"文字目 ");
	System.out.println("マッチ文言:"+matcher.group());
}
(表)正規表現のマッチ情報を取得するための特に頻出のメソッド
メソッド名 説明
find() 次の照合一致がある場合はtrueを返します。

(例)
正規表現: d{3}
照合対象: abc123def456
という照合条件がある場合、以下のような動きになります。
・1回目のfind()
「123」がヒットしてtrueになります。
・2回目のfind()
「456」がヒットして再び「true」を返却します。
・3回目のfind()
これ以上はヒットがないため「false」を返却します。

start() 現在のマッチにおける、文字列のマッチ「開始位置」のインデックスをint型で返却します。インデックスは0スタートのため、実際のN文字目の一致箇所と対応させるには「+1」します。
end() 現在のマッチにおける、文字列のマッチ「終了位置」のインデックスをint型で返却します。インデックスは0スタートのため、実際のN文字目の一致箇所と対応させるには「+1」します。
group() 現在のマッチにおける、マッチ結果のテキストをString型で返却します。

目次にもどる

(1-3) サンプルプログラム

これまでのSTEP1~STEP4までの手順を全てまとめて1つのプログラムとして実行可能な状態にまとめたものが以下です。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IT02xx_RegularExpresstionTest {
    public static void main(String args[]) {

        //前準備:照合対象の文字列
        String word = "Boeing777's first flight was in 1994";

        //STEP1.正規表現の定義
        String regex= "\\d{3}";

        //STEP2.パターンobjectの生成
        Pattern pattern = Pattern.compile(regex);

        //STEP3.照合の実行
        Matcher matcher = pattern.matcher(word);

        //STEP4.照合結果の取得
        while (matcher.find()) {
            System.out.print("マッチ開始:"+(matcher.start()+1)+"文字目 ");
            System.out.print("マッチ終了:"+(matcher.end()+1)+"文字目 ");
            System.out.println("マッチ文言:"+matcher.group());
        }
    }
}

(図131)実行結果

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

JSP Servletでセッションの有効期限を設定する方法

<目次> (1) JSP Servletでセッションの有効期限を設定する方法  (1-1) セッションの有効期限設定の概要  (1-2) 方法1:web.xmlに追記する方法  (1-3) 方法2:プ …

Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法

<目次> (1) Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法  (1-1) 発生状況  (1-2) 原因  (1-3) 対処方法 ( …

TwitterAPIのJavaでの使い方をご紹介~【入門編】Twitter4j導入~ハッシュタグでツイート検索するまで~

<目次> (1) TwitterAPIのJavaでの使い方をご紹介  (1-1) STEP0:前提条件  (1-2) STEP1:ライブラリ(jar)のダウンロード  (1-3) STEP2:アプリケ …

Javaのenumでフィールドを複数定義したり、値を取得する方法

<目次> (1) Javaのenumでフィールドを複数定義したり、値を取得する方法  (1-1) enumでフィールドを定義・取得する  (1-2) enumでフィールドを複数定義・取得する (1) …

JVMの基本アーキテクチャと各サブシステム等の概要説明について

(0)目次&概説 (1) 記事の目的 (2) Javaのアーキテクチャ概要・概観 (3) JVMのアーキテクチャ概要  (3-1) JVMの概観  (3-2) JVMの主要サブシステム1:Class …

  • English (United States)
  • 日本語
Top