正規表現:数字のみをマッチする表現

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

正規表現を使って、文字列から数字のみをマッチすることで、恣意的に入力されたデータから、数字を抜き出し、データとして整形します。

数字を表す正規表現

数字は「文字クラス」を用いてマッチングするのが分かりやすく一般的です。半角数字、全角数字は文字コードが異なりますので、意識して区別します。また、エスケープシーケンスの表現もあります。

// 半角数字
[0-9]

// 半角数字(エスケープシーケンス)
\d

// 全角数字
[0-9]

// 半角か全角のいずれか
[0-90-9]

数字のみマッチして取り出す処理の例

「数字」を正規表現で定義する

テキストのなかから、数字のみを抽出する処理を考えてみます。上記の文字クラスに加えて、量指定子「+」を用いて1回以上の繰り返しをマッチします。まずは、半角数字、全角数字を文字クラスに含めます。

[0-90-9]+

あとは、例えば、「19,000円」などのコンマ付きからコンマなしを含むようにします。念のため、全角の「,」も含めておきましょう。

[0-90-9,]+

「23.5cm」などの小数の値もマッチします。同様に、半角だけでなく、全角の「.」も含めます。

[0-90-9,,..]+

このように、実際に厳密にあらゆる数値をマッチングしようとすると、上記以外にも、プラスマイナスの符号を含めたり、・・、検討するべき要素が増えていきます。今回は単純な数字パターンのみのマッチングまでとしておきます。詳細は状況に合わせて正規表現を調整してみて下さい。

文字列から数字を抽出する関数を作成する

さて、実際の処理を踏まえて、サンプル関数をつくってみました。

下記は、PHPの例です。

<?php
  /**
   * 数字のみ抽出する
   *
   * @param string ソース文字列
   * @return string 抽出した数値
   */
  function extract_number( $subject = '' ) {

    $pattern = '/[0-9.,0-9.,]+/u'; // パターン。末尾のuを忘れずに。

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

      // マッチングした数字を抜き出す
      $num = $matches[0];

      // 半角数字に変換
      $num_half_width = mb_convert_kana( $num, 'anr' );

      // 区切りカンマを削除
      $num_plain = preg_replace( '/,/', '', $num_half_width );

      // 小数の値として正規化
      $num_float = (float) $num_plain;

      // 文字列で返す
      return (string) $num_float;

    }

  }

PHPの正規表現関数PCREは、1バイト単位で処理を行うため、UTF-8において可変長バイトとなる全角文字をうまく扱えません。正規表現末尾に修飾子に「u」を付けると、一文字単位で処理を行ってくれます。

また、全角と半角の変換を含めました。PHPに既存のマルチバイト文字列処理関数 mb_convert_kana() が用意されていますので、しっかりと恩恵にあずかりましょう。

それでは、実際に、テストしてみます。

// いろいろテスト
var_dump( extract_number( '210円のジュース' ) ); // 210
var_dump( extract_number( '1,900億円の事業規模' ) ); // 1900
var_dump( extract_number( '27.5cmのシューズ' ) ); // 27.5

当然ですが、「億円」はうまく億の数字になりませんね・・・。こちらは各自、必要に応じて処理を追加して下さい。

数字の正規表現に関する参考記事

正規表現の数字に関する記事です。