正規表現のキホン

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

1.正規表現の基本構文

 各プログラム言語、DBMSごと、正規表現を使って検索、置換を処理する関数が準備されています。
 これら関数を使用する際、はじめに準備するのが、「正規表現のパターン」です。
 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つの対応方法をまとめました。