正規表現での、数字に桁数に関する方法に関してです。また、これを応用して、数字の大きさの範囲を指定します。
目次
数字の正規表現
正規表現で「数字」を表現するとき、下記のように文字クラス」を利用するか、数字を表す「エスケープシーケンス」で表現できるのでした。下記はそれぞれ1文字半角数字、すなわち、一桁の数値を表します。
//1文字の数字(文字クラス。0,1,2,...9のいずれもマッチする)
[0-9]
// 1文字の数字(エスケープシーケンス)
\d
数字の「桁数」を指定する正規表現
この表現に、量指定子「{n}」とを組み合わせると、特定の桁数の数字を表すことができます。(Vimでの量指定子は記法が異なりますので、こちら「正規表現:特殊文字(メタ文字)の一覧」を御覧ください)
◯桁の数字
文字クラスを利用して「半角数字のいずれか」、また、量指定子「{N}」で具体的な繰り返しの数を指定して、桁数を表現できます。例えば、これで4桁の数字を表せます。
// 4桁の数字 [0-9]{4}
注意が必要なのは、上記は「0001」など、数値としては自然な表現ではない文字列をもマッチしてしまう点です。目的にもよりますが、もしこのようなマッチングが発生することが問題になる時は、後述の「数字の大きさの範囲」を表す正規表現を利用して下さい。
数字の範囲(桁数)を表す正規表現
◯桁以上、◯桁以下の数字
カンマで区切った「{N,M}」とすれば、直前の文字の「〜以上〜以下の繰り返し」といった表現が可能です。これを利用して、数字の桁数の上限と下限を指定します。
// 4〜8桁の半角数字 [0-9]{4,8}
◯桁以上の数字
最大値の記載を省くと、上限を指定しないこともできます。下記は、半角数字の4回以上の繰り返しを表現した例です。上記と同様に「0000001」などの文字列もマッチすることに注意して下さい。
// 4桁以上の半角数字 [0-9]{4,}
◯桁以下の数字
もう推測がつくと思いますが、下限を省くこともできます。
// 8桁の半角数字 [0-9]{,8}
「{N}」などの、量指定子については、こちらのまとめましたので、ぜひご覧ください。
数字の大きさの範囲の指定
数字の桁数の指定を利用して、数字の大きさの範囲を指定できます。正規表現には数字の大小を吟味する仕組みがありませんので、あくまで文字列表現として検討する必要があります。
N以上、M以下の範囲の数字(1桁の場合)
一桁の数字の場合は非常にシンプルです。文字クラスを使って数字の範囲を指定できます。
// 5以上, 9以下の数字 [5-9]
N以上、M以下の範囲の数字(1〜2桁の場合)
Nが一桁の場合と、二桁の場合を、場合分けして考えます。それぞれ、「|(パイプ)」を使って「OR」の関係性を記述します。
// 1以上、99以下の2桁の数字 [1-9]|[1-9][0-9] // 3以上, 13以下の2桁の数字 [3-9]|1[0-2] // 33以上, 99以下の2桁の数字 3[3-9]|[4-9][0-9]
2023/3/26 「99以下」の正規表現を修正しました。とおりすがり様ご連絡いただきありがとうございました。
【参考】 数字を含む複雑な文字列のサンプル集
さて、数字だけでなく、数字を含む文字列をうまく表現する例をいくつか紹介します。説明の簡単のため、すべて半角数字という事にします。
日付の表現
「2018/1/2」などの日付を表現します。ここでは、年号は1900年以上の4桁の数字に範囲を限定します。
19[0-9]{2}|[2-9][0-9]{3}/
なお「/(スラッシュ)」は、デリミタとして利用している場合、バックスラッシュでエスケープし「\/」と記述する必要があります。デリミタが「#」のような別の記号であれば、エスケープは不要です。(Javascriptでは、デミリタはスラッシュのみ許可されています)
エスケープの必要性については、こちらの記事をご覧ください。
国内で有効な携帯電話番号の数字
上記の応用です。フォームに入力された文字列のバリデーションに利用できる、かもしれませんね。
// 携帯電話番号。ハイフンを利用しても、しなくてもどちらでも良い。 0[89]0-?[0-9]{4}-?[0-9]{4}
量指定子「?」は、0〜1回の出現を表します。上記の例は、「-?」によって、ハイフンがある場合、無い場合のいずれもマッチすることができます。
以上、数字の表現に関してでした。量指定子をうまく利用し、また、対象にしている数字の桁数や、他の文字の出現の仕方をうまく捉えることで、柔軟なマッチングが可能になると思います。
参考
数字を扱う時は、全角数字と半角数字の違いにご注意下さい。こちらもご確認下さい