正規表現のキホン

 正規表現を使うと、複雑な検索を必要最小限のコーディングで実現できます。
 反面、あまり複雑に組み合わせるとプログラムコードの視認性が悪くなり、改修の際など余計に大変になるので、ループと条件分岐で代用した方が良いという話も、現場では良く聞きます。
 また正規表現は、数字と記号の羅列だけなので、覚えにくく、少し使用していないとすぐに忘れてしまうというのも難点です。
 ここでは、どのプログラムでも使用される。正規表現の一番キホンになる構文だけをピックアップしてまとめたいと思います。
 深くあらゆるオプションを覚えても、どうせ忘れるから、キホンだけ覚えておいた方が忘れにくいのでは?という発想です。

1.正規表現の基本構文

 各プログラムごと、正規表現を使って検索、置換を処理する関数が準備されています。
 これら関数を使用する際、はじめに準備するのが、「正規表現のパターン」です。
 PHPを例とした場合、正規表現で検索を行う関数として、mb_ereg関数があります。

 上図のように、「正規表現のパターン」と「検索する文字列」をパラメータとして結果を出します。

 この「正規表現のパターン」を以下まとめます。

正規表現のパターン

 以下の検索文字繰り返し位置を組み合わせて正規表現のパターンを作ります。


 ~ 検索文字 ~ 

正規表現 説明
(任意) ユーザーが、直接指定する1文字です。
例えば「P」という文字が含まれるか調べる場合は「P」を直接指定します。
. 任意の1文字を表します。
[ABC] 「A」または「B」または「C」の1文字を表します。
例えば「ADD」のように文字列に1文字でも含まれればマッチとなります。
「AAA」のように3文字ヒットしてもマッチとなります。
「DDD」のように1文字もヒットしなければ、アンマッチです。
[^ABC] 「A」または「B」または「C」でない1文字を表します。
例えば「AAD」のように文字列に1文字でも含まれればマッチとなります。
「DDD」のように3文字ヒットしてもマッチとなります。
「AAA」のように1文字もヒットしなければ、アンマッチです。
[集合]の中に書かれた^は否定の意味で使われますが、それ以外で使うと先頭という意味になるので、
注意が必要です。
[0-9] [0123456789]と同じ意味です。数字1文字を表します。
[A-Z] [ABCDEFGHIJKLMNOPQRSTUVWXYZ]と同じ意味です。数字1文字を表します。
[0-9A-Za-z] 英数字1文字を表します。
このように[ABC]の集合同様、文字範囲指定の場合も連続して書けます。
(AAA|BBB) 「AAA」または「BBB」を表します。
1文字ではなく任意の文字集合ごとOR条件にする場合は、()でグループ化したうえで、|で区切ります。
\s 空白の1文字を表します。
全半角スペースまたは制御文字[\t\n\r\f\v]と同じ意味です。全角スペースは環境依存です。
\S 空白の1文字以外を表します。
全半角スペー以外または制御文字[\t\n\r\f\v]以外です。

 ~ 繰り返し ~ 

正規表現 説明
* 0回以上の繰り返しです。
+ 1回以上の繰り返しです。
{n} n回の繰り返しです。

 ~ 位置 ~ 

正規表現 説明
^ 先頭です。
$ 末尾です。


正規表現のパターン例と結果

正規表現のパターン例 検索する文字列 結果
mb_ereg('A.C',検索する文字列) ABC
ABX ×
XABCX
ABBC ×
ABCABC
mb_ereg('^A.C$',検索する文字列) ABC
ABX ×
XABCX ×
ABBC ×
ABCABC ×
mb_ereg('^[0-9]{3}-[0-9]{4}$',検索する文字列) 123-4567
1234567 ×
123-A567 ×
123-45678 ×

正規表現による置換えの場合の注意

 正規表現による置換えの場合、どこまでの範囲を置き換えるのかを示す、最長マッチ最短マッチを意識する必要があります。


2.各プログラム言語ごと正規表現の使用方法

PHP

関数 説明
mb_ereg(正規表現のパターン,検索する文字列) 正規表現による検索を行う。
mb_eregi(正規表現のパターン,検索する文字列) 大文字小文字を区別せずに正規表現による検索を行う。
mb_ereg_replace(正規表現のパターン,置換える文字列,検索する文字列) 正規表現による置換を行う。
mb_eregi_replace(正規表現のパターン,置換える文字列,検索する文字列) 大文字小文字を区別せずに正規表現による置換を行う。

 ~ 関数使用例(mb_ereg) ~ 

<?php
//例:郵便番号のバリデーションチェック
$target="123-4567";
if(mb_ereg('^[0-9]{3}-[0-9]{4}$',$target)){
	//echo "○";
}else{
	echo "正しく入力して下さい。";
}
?>

Java

必須インポート:
import java.util.regex.Pattern;
import java.util.regex.Matcher;

関数 説明
(PatternObj)=Pattern.compile(正規表現のパターン) Java内で使用する正規表現のパターンオブジェクトを生成。
(MatcherObj)=(PatternObj).matcher(検索する文字列) 正規表現のパターンオブジェクトと検索する文字列を操作比較するマッチャーオブジェクトを生成。
(MatcherObj).find() 正規表現のパターンが検索する文字列に含まれるか結果を返す。

 ~ 関数使用例 ~ 

//例:郵便番号のバリデーションチェック
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PostNoCheck {
    public static void main(String[] args) {
 
        // 検索する文字列
        String target = "123-4567";
 
        // 正規表現のパターンオブジェクトを生成
        Pattern p = Pattern.compile("^[0-9]{3}-[0-9]{4}$");
        
        //マッチャーオブジェクトを生成
        Matcher m = p.matcher(target);
if (m.find()){
      //System.out.println("○");
    }else{
      System.out.println("正しく入力して下さい。");
    }


VB

必須インポート:
Imports System.Text.RegularExpressions

関数 説明
Regex.IsMatch(検索する文字列,正規表現のパターン) 正規表現による検索を行う。

 ~ 関数使用例(mb_ereg) ~ 

'例:郵便番号のバリデーションチェック
Imports System.Text.RegularExpressions

dim target as String

target="123-4567"

If Regex.IsMatch(target,"^[0-9]{3}-[0-9]{4}$") Then
	//MsgBox "○";
Else
	MsgBox "正しく入力して下さい。"
End If




おすすめの関連記事

エスケープシーケンスと文字実体参照
文字を扱う際に注意すべき2つの対応方法をまとめました。