正規表現:全角数字、半角数字の表現

最終更新:2018-02-16 by Joe

正規表現での、半角、全角数字に関する表現方法をまとめました。

半角数字、全角数字の正規表現

半角数字

正規表現では、「[」「]」を使った文字クラスを利用すると、数字文字を簡単に表すことができます。また「-」を使って、ASCIIコード上での範囲を指定することもできます。全角数字は含まず、半角数字に限定されている事に注意して下さい。

// 文字クラスを使った数字の表現
[0-9]

また、エスケープシーケンス「\d」を使った表現は便利です。これにより、「半角いずれかの数字1文字」を表す事ができます。

// エスケープシーケンスを使った半角数字の表現
\d

ちなみに「\」と大文字にすると「半角数字以外の1文字」を表すこともできます。ご参考まで。

// 半角数字以外の1文字 
\D

全角数字

全角数字も同じく文字クラスを使って表現可能です。半角数字とは完全に区別されます。

// 文字クラスを使った数字の表現
[0-9]

全角数字、半角数字のいずれか

文字クラスで両方を許可します。

// 文字クラスを使った数字の表現
[0-90-9]

数字の桁数の正規表現

さて、上記では「1文字の数字」を表現しましたが、量指定子「{N}」とを組み合わせると、特定の桁数の数字を表すことができます。(Vimでの量指定子は記法が異なりますので、こちら「正規表現:特殊文字(メタ文字)の一覧」をご覧ください。)

下記はあくまで文字列としての桁数ですので、「0001」のような文字列をもマッチングする点に注意して下さい。

// 4桁の半角数字
[0-9]{4}

// 4桁以上の半角数字
[0-9]{4,}

// 4桁-8桁の半角数字
[0-9]{4,8}

// 8桁の半角数字
[0-9]{,8}

また、種々の量指定子については、こちらのまとめましたので、ぜひご覧ください。

数値の範囲の正規表現

桁数の応用で、数値としての大きさの範囲を指定できます。正規表現には数値の大小を吟味する仕組みがありませんので、あくまで文字列として表現を検討する必要があります。複数桁の場合は、Nが一桁の場合と、二桁の場合を、場合分けして考えます。

// 5以上, 9以下の数字
[5-9]

// 3以上, 13以下の2桁の数字
[3-9]|1[0-2]

// 33以上, 99以下の2桁の数字
3[3-9]|[2-9][0-9]

【実践】全角・半角数字のマッチング

PHPを使って全角数字、半角数字をマッチしてみます。preg_match()関数は、第三引数の$matchesにマッチした文字列が入ります。必ず半角数字で出力するようにmb_convert_kana() 関数を用いました。

<?php

$subject = 'りんご:180180円';

// 数字1文字をマッチ。末尾の「u」修飾子を忘れず。
$pattern = '/[0-90-9]+/u';

if ( preg_match( $pattern, $subject, $matches ) ) {

  // 半角数字に変換
  echo mb_convert_kana( $matches[0], 'anr', 'utf-8' );

}

上記はシンプルなマッチング方法ですが、例えば「1,000」などのカンマ付き数値や、「23.5」などの少数もマッチング対象に含めるには、工夫が必要です。こちらの記事にも詳しくまとめていますので、御覧ください。

修飾子「u」について

上記の$pattern末尾の「u」は、PHPにおける全角文字の正規表現マッチングには必須の修飾子です。PHPでは、正規表現マッチングは、2バイト単位で行われるため、全角文字はUTF-8において可変長バイトとなる全角文字を正しくマッチできません。「u」は、これを全角一文字単位でマッチングするための指定となります。また実際の処理の際は、ファイル内の文字コードとPHPの内部文字コードに注意して下さい。

パターン修飾子に関して、詳しくはPHP公式ドキュメントでご確認下さい。

こちらは、PHPの正規表現関数、preg_matchの仕様です。

参考

ご参考まで、今回利用した、量指定子についてまとめておきます。いったん覚えてしまうとスラスラ書けるようになるでしょう。

量指定子(最長一致)最短一致意味
**?直前のパターンの0回以上連続
++?直前のパターンの1回以上連続
???直前のパターンの0回か1回の出現
{N} - 直前のパターンのN回の連続
{min,}{min,}?直前のパターンのmin回以上の連続
{,max}{,max}?直前のパターンのmax回以下の連続
{min,max}{min,max}?直前のパターンのmin回からmax回の連続

そのほか、特殊文字に関してはこちらの記事もぜひ、ご覧ください。