正規表現を使って、文字列から数字のみをマッチすることで、恣意的に入力されたデータから、数字を抜き出し、データとして整形します。
数字を表す正規表現
数字は「文字クラス」を用いてマッチングするのが分かりやすく一般的です。半角数字、全角数字は文字コードが異なりますので、意識して区別します。また、エスケープシーケンスの表現もあります。
// 半角数字
[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
当然ですが、「億円」はうまく億の数字になりませんね・・・。こちらは各自、必要に応じて処理を追加して下さい。
数字の正規表現に関する参考記事
正規表現の数字に関する記事です。