正規表現

正規表現の連番は2桁以上なら控えよう | 大小比較のIFで書こう

正規表現で連番を書くのは避けよう
  • 1桁の連番は\d, または[0-9]
  • 2桁以上の連番は1[3-9]|[2-5][0-9]のように複雑になる
  • 2桁以上の連番はExcelマクロやプログラミング言語などで表現しよう

正規表現での連番はややこしい

正規表現で連番を処理するのはあまり適切ではありません。1桁の数値や001〜999のように抜けのない数値であれば指定ができますが、複雑な数値を表現するのであればExcelやプログラミング言語の方に処理を任せたほうが無難です。

そのうえであえてやるとした場合の処理を以下で説明します。

正規表現で連番を出す方法(1桁)

1桁であれば次のように指定すれば可能です。

// 0〜9の1桁の数値
\d
// または
[0-9]
// 意味としては↓も一緒
[0123456789]

// 3-7の1桁の数値
[3-7]

[]で囲まれた文字は文字クラスと呼ばれ、[]に囲まれたいずれか1文字を表します。たとえば[0123456789]とかくと「0123456789」のどれかの数値を表すため、1桁の数値を表現するのに使えるということです。

[]内で囲まれた中においては“-“を使うことで範囲を表すことができ、[0-9]とすると0〜9の1桁の数値ということで[0123456789]と同じ結果になります。また、\dは[0-9]を表す特殊な記号のため、これも同様に[0123456789]を表します。

正規表現で連番を出す方法(2桁以上)

正規表現で2桁以上の連番を表す際には次のように表現します。

// 00〜99の2桁の数値
\d{2}

// 13〜59の2桁の数値
1[3-9]|[2-5][0-9]

シンプルに00から99までを表したいのであれば、数値を表す\dとそれをN回繰り返す{N}を用いることで\d{2}と表現できます。

ただし13〜59のように特定の位置ではじまったりおわったりすると話が複雑になります。1[3-9]|[2-5][0-9]の表しているものを分解すると、|で左右に区切って1[3-9]と[2-5][0-9]に分かれます。

1[3-9]は十の位が1で一の位が3456789のいずれかである数を表しています。具体的には13〜19ですね。[2-5][0-9]では十の位が2〜5で一の位が0123456789のいずれかなので、20〜59を表します。

そして“|”は「または」を表す記号なので、左部分の13〜19「または」右部分の20〜59を表します。よって1[3-9]|[2-5][0-9]では13〜59を表現できるというわけです。

オーキド博士

[13-59]みたいな書き方がだめなのかの〜?

シャワーズ

[]の中だと数字は1桁ずつ処理されてるうえに”-“を挟む数字は範囲を示すようになってしまうんだ。だから[13-59]とかくと、1,345,9を表現していることになって[13459]を意味する形になるよ

そもそも連番は正規表現を使わないで処理したい

以上をふまえると、2桁以上の連番を正規表現で表すのは複雑になりがちなのがわかるかと思います。そのため連番は正規表現以外の表し方で処理するのが無難だというのが私の結論です。

たとえばJavaScriptで13〜59をかくと次のようになります。

var a = 30;

if (13 <= a && a <= 59){
  //処理
}

めちゃくちゃシンプルにかけますよね。正規表現で無理にかこうとせず他の書き方で処理ができないのかを考えてみましょう。