正規表現での、半角、全角数字に関する表現方法をまとめました。
半角数字、全角数字の正規表現
半角数字
正規表現では、「[」「]」を使った文字クラスを利用すると、数字文字を簡単に表すことができます。また「-」を使って、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回の連続 |
そのほか、特殊文字に関してはこちらの記事もぜひ、ご覧ください。