検索

キーワード


【Java】正規表現を使って文字列を工夫!!使い方と実例も紹介!!

  • 公開日:2020-10-22 22:28:55
  • 最終更新日:2021-01-25 16:21:01
【Java】正規表現を使って文字列を工夫!!使い方と実例も紹介!!

こんにちは。新人エンジニアのサトウです。

システムエンジニアとして駆け出したばかりですが、

初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。


プログラム初心者✅にも、プログラムに興味がある人✨も、

短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!

『正規表現』へ足を踏み入れよう

正規表現(Regular expression)

特定の要素を持つ複数の文字列や数値を一つのパターンで表す記述法を正規表現といいます。

引数に正規表現のパターンを指定することによって、

パターンの要素を持つ文字列をまとめて操作するといった処理を行うことができるようになります。


正規表現を使うことによって、文字列検索や文字列操作の作業効率が非常に向上します。

正規表現の情報量は膨大で全てを完璧に習得するにはかなりの時間かかりますが、

Javaに限らず他のプログラミング言語でも同じように使うことができるため

しっかりと身につければ大いに役立つことは間違いありません。


先ず正規表現の仕様についてしっかりと理解をすることが重要になってきます。

パターンの仕様

正規表現によるパターンは通常の文字メタ文字(特殊文字)という特殊な記号を組み合わせて記述します。

メタ文字とは、 .  +  *  ^  $  などの記号です。

以下の5つのパターンはすべて正規表現の例です、正規表現パターンのイメージを掴みましょう。

a...o     ^abc     xyz$     ^123\d     \d{5}     等 


例えば「.(ピリオド)」は正規表現において”任意の一文字”を表しています。

ですので a...o 最初がa最後がoで終わり間に3つの任意の文字が続く5つの文字を表しています。

aiueo    axyzo    a123o    aいうえo    などがこのパターンにマッチするということになります。


以下の表が基本的な正規表現で使用する記号です。これらを組み合わせて、様々なパターンを表すことができます。

基本的な正規表現の表


これらの記号を組み合わせて、よく表される正規表現の表記の例を以下の図で確認しましょう!

よく使われる正規表現の表記


正規表現のパターンにおいて、

意義のあるメタ文字 .  *  +  ()  ^  $  は記号そのままの表記では表すことができません。

表記したい場合はエスケープシークエンスのように、

先頭にバックスラッシュ(『/』の左右反対記号)、または『\』マークをつけることで、

そのままの記号を使うことができるようになります。覚えておきましょう!

参考:【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス


PatternクラスとMatcherクラス

Javaの正規表現は、java.util.regex.Patternクラスで定義されています。

javaで使用可能な正規表現が、javadoc-Patternクラスに載っているので是非確認してください。

またこのクラスには正規表現を格納したオブジェクト(Patternオブジェクト&Macherオブジェクト)

を生成するメソッドが実装されています。

参考リンク:javadoc-Pattern 


正規表現のパターンを解釈し、

文字列とのマッチング操作を行うメソッドがMatcherクラスに実装されています。

参考リンク:Javadoc-Matcher


ここではこの二つのクラスを利用した正規表現の使い方について紹介していきます。

正規表現のオブジェクト生成

Patternクラスに実装されているメソッドを利用して正規表現のオブジェクトを生成していきます。


- Patternオブジェクト生成/complieメソッド

Patternクラスのcomplieメソッドは、正規表現をパターンオブジェクトに格納します

引数に正規表現を指定します。

Pattern compile(String regex)


- Macherオブジェクト生成/matcherメソッド

PatternクラスのmacherメソッドでMatcherオブジェクトを生成することができます。

引数にパターンとマッチさせる文字列を指定して文字列と正規表現のパターンを格納したオブジェクトが生成されます。

このMacherオブジェクトは、Macherクラスのメソッドを使ってマッチング操作を行うことができます。

Matcher	matcher(文字列)


- 上記のサンプルコード

上記の二つのメソッドを使用して、

Macherオブジェクトを生成するまで流れを実際のコードで確認しましょう。

サンプルコード

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

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

        String s = "東京都千代田区";
        String s1 = "東京都台東区";
        String t = "自然保護区";

        //正規表現
        String regex="東京都.{1,3}区";
//Patternオブジェクトに正規表現をコンパイル Pattern p = Pattern.compile(regex); //Matcherオブジェクトを生成 Matcher m = p.matcher(s); Matcher m1 = p.matcher(s1); Matcher m2 = p.matcher(t); } }

文字列と正規表現パターンが格納(コンパイル)されたMacherオブジェクトの生成までを行うことが出来ました。

(サンプルコードでは、Macherオブジェクトm,m1,m2の3つが生成!)

このオブジェクトを次の項で実際に使っていきます!!



マッチング操作

前項で生成したMatcherオブジェクトにMacherクラスのメソッドを使用して、

文字列と正規表現パターンのマッチング操作をすることができます。


- 文字列とパターンのマッチングを確認する操作


Macherクラスには三種類のマッチング確認用メソッドが実装されています。


matchesメソッド 文字列がパターンにすべてマッチする場合にtrueを返す。

boolean	matches()

lookingAtメソッド 文字列の先頭部分(接頭辞)がパターンとマッチする場合にtrueを返す。

boolean	lookingAt()

findメソッド 文字列の中にマッチするパターンがある場合にtrueを返す。

boolean	find()



findメソッドには、前回のマッチ成功時の終了インデックスから走査するという仕様があります。

最初からマッチング操作をし直す時にはresetメソッドを使用しましょう。

Matcher	reset()


サンプルコードで使い方を確認します。

◆サンプルコード

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

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

		String s = "東京都千代田区";
		String s1 = "東京都台東区上野";
		String t = "自然保護区";

		//正規表現
		String regex = "東京都.{1,3}区";

		//Patternオブジェクトに正規表現をコンパイル
		Pattern p = Pattern.compile(regex);

		//Matcherオブジェクトを生成
		Matcher m = p.matcher(s);
		Matcher m1 = p.matcher(s1);
		Matcher m2 = p.matcher(t);

		//Matcherクラスのmatchesメソッド
		System.out.println("----matches----");
		System.out.println(m.matches());
		System.out.println(m1.matches());
		System.out.println(m2.matches());

		//MatcherクラスのlookingAtメソッド
		System.out.println("----lookingAt----");
		System.out.println(m.lookingAt());
		System.out.println(m1.lookingAt());
		System.out.println(m2.lookingAt());

		//リセット(findメソッドを正常に使うため)
		m.reset();
		m1.reset();
		m2.reset();

		//Matcherクラスのfindメソッド
		System.out.println("----find----");
		System.out.println(m.find());
		System.out.println(m1.find());
		System.out.println(m2.find());
	}
}

◆出力結果

----matches----
true
false
false
----lookingAt----
true
true
false
----find----
true
true
false



- マッチした詳細情報を調べる操作

文字列がパターンとマッチしているかどうか調べた後に、

マッチした文字列の詳細情報を得たい場合は以下のメソッドが使えます。

ここでは三種類紹介します。


startメソッド パターンとマッチした文字列の開始インデックス(begin index)を戻り値として返す。

int start()

endメソッド パターンとマッチした文字列の末尾インデックス(end index)を戻り値として返す。

int end()

groupメソッド パターンにマッチした文字列を返す。

String	group()



サンプルコードで確認しましょう。

ここではfindメソッドを実行後に詳細情報を取得します!

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

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

		String s = "東京都千代田区";
		String s1 = "東京都台東区上野";

		//正規表現
		String regex = "東京都.{1,3}区";
//Patternオブジェクトに正規表現をコンパイル Pattern p = Pattern.compile(regex); //Matcherオブジェクトを生成 Matcher m = p.matcher(s); Matcher m1 = p.matcher(s1); System.out.println("----findメソッド----"); System.out.println("m:"+m.find()); System.out.println("m1:"+m1.find()); System.out.println("----startメソッドとendメソッド----"); System.out.println("m:begin["+m.start()+"]end["+m.end()+"]"); System.out.println("m1:begin["+m1.start()+"]end["+m1.end()+"]"); System.out.println("----groupメソッド----"); System.out.println("m:"+m.group()); System.out.println("m1:"+m1.group()); } }


出力結果

----findメソッド----
m:true
m1:true

----startメソッドとendメソッド----
m:begin[0]end[7]
m1:begin[0]end[6]

----groupメソッド----
m:東京都千代田区
m1:東京都台東区


- マッチする文字列の複数取得(while文の使用)


検索対象の文字列内にマッチするパターンが二つ以上存在する場合に、

繰り返し文(while文)でfindメソッドを使用することにより、

文字列内のマッチする文字列をすべて検索することができます。


マッチする文字列が複数入った文字列を使って、

while文の中でfindメソッドを使ったサンプルコードを確認しましょう。

サンプルコード

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

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

		//マッチする文字列が複数入った文字列の用意
		String u = "東京都千代田区,東京都台東区,東京都港区";

		//Matcherオブジェクトを生成まで
		String regex = "東京都.{1,3}区";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(u);

		//繰り返し文
		while(m.find()){
			System.out.println(m.group());
		}
	}
}

出力結果

東京都千代田区
東京都台東区
東京都港区




正規表現が使えるStringクラスメソッド

Stringクラスの文字列を操作するメソッドの中には

引数に正規表現のパターンを指定できるものがあります。

以下のような操作が例に挙げられます。


比較(matches)

分割(split)

置換(replaceAll,replaceFirst)



メソッドの詳細な使い方については以下の記事で紹介しています。

【Java】Stringクラスについての理解と基本的な文字列操作

【Java】Stringクラスの文字列比較・判定・検索

ここでは置換(replaceAll)操作のサンプルコードを確認してみましょう。


- replaceAllメソッドのサンプルコード

String replaceAll(文字列or正規表現, 置換する文字列)


サンプルコード

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

		String format = "東京都千代田区";
		String change = "台東区";

		String str =format.replaceAll(".{1,3}区", change);
		System.out.println(str);
	}
}

出力結果

東京都台東区


第一引数で指定した正規表現のパターンとマッチした変数format文字列内の部分文字が、

第二引数で指定した文字列に置き換わっています。


   ・・・・     ・・・

東京都千代田区 ⇒東京都台東区


これが正規表現を使った置換です。他のString操作もリンク記事を参考に実際にコードを書いて動かすと面白いと思います!


【著者】

新人SE・サトウ

読者を始め私自身も知りたい!と思うような知って得するプログラミング知識やIT情報を日々発信中です。
筆者の憧れの人物は、コリン・ファースさん、渡部篤郎さん。
教養のあるカッコいい大人になれるよう、プログラミングを始め興味関心を持ったことを毎日勉強しております !!

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様