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

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

関連記事

JNDIとは?JDBCとの違いやメリット・デメリットについてもご紹介

<目次> (1) JNDIとは?JDBCとの違いやメリット・デメリットについてもご紹介  (1-1) JDBCとは?  (1-2) JNDIとは?   (1-2-1) 概要   (1-2-2) JND …

double型で誤差が発生する件について+発生事例やサンプルプログラムも紹介

<目次> (1) double型では誤差が発生する事について  (1-1) double型は近似値を使用している  (1-2) double型の誤差の例 (1) double型で誤差が発生する件につい …

Javaのprintfで右揃え(右詰め)や左揃え(左詰め)にフォーマットする方法

<目次> (1) Javaのprintfで右揃えや左揃えにフォーマットする方法  (1-1) 構文  (1-2) 右揃えの方法  (1-3) 左揃えの方法  (1-4) 主要な変換文字(s,d,f,t …

Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介

<目次> (1) Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介  (1-1) 抽象クラス(abstract)とは  (1-2) 抽象クラスの目的や用途  (1-3) 抽象クラ …

EARファイル・WARファイル・JARファイルの違いや特徴について

  <目次> (1) EARファイル・WARファイル・JARファイルの違いや特徴について  (1-1) JARファイルとは(.jar)  (1-2) WARファイル(.war)  (1-3) …

  • English (United States)
  • 日本語
Top