文字列が数値として妥当か調べる正規表現

文字列が数字のみで構成されているかのチェックは簡単ですが、数値として正しいかどうかのチェックは複雑です。専用の関数が用意されている言語もありますが、細かい動作(空文字の場合どうなるかなど)が不明確だったりするので、自前で用意するのが確実だと思います。で、そのチェック関数で使用する正規表現自然数用と整数用)を書いてみました。


自然数

/^[1-9][0-9]*$/


整数

/^[+-]?([1-9][0-9]*|0)$/


整数の方は少しわかりづらいので、Rubyで適当にテストコードを書きました。

#!ruby
ok_values = ["0",
             "+0",
             "-0",
             "10",
             "1234"]
ng_values = ["-",
             "+",
             "++0",
             "+-0",
             "--0",
             "00",
             "01",
             "3B"]
logs = []
ARGV.each do |arg|
  logs << "/#{arg}/ test start."
  reg = Regexp.new(arg)
  logs << "  OK test start."
  ok_values.each do |val|
    if reg =~ val
      logs << "    \"#{val}\" is completed."
    else
      logs << "    \"#{val}\" is failed!!!!!!!!!!"
    end
  end
  logs << "  NG test start."
  ng_values.each do |val|
    if reg !~ val
      logs << "    \"#{val}\" is completed."
    else
      logs << "    \"#{val}\" is failed!!!!!!!!!!"
    end
  end
end
logs.each {|log| puts log }

コマンドライン引数に正規表現文字列を設定して実行してみてください。
引数を複数渡せば、同時に実行できます。
■実行例

ruby regexp_test.rb "^[+-]?([1-9][0-9]*|0)$" "^[1-9][0-9]*$"


正規表現の解説

  • 位置指定
    • ^:行頭
    • $:行末(改行文字ではない)
  • 条件判断
    • [abc]:"a"または"b"または"c"
    • (abc|d|ef):"abc"または"d"または"ef"
  • 回数指定
    • *:0回以上の繰り返し
    • +:1回以上の繰り返し
    • ?:0〜1回


■参考
正規表現 - Ruby 1.8.7 リファレンスマニュアル
http://doc.okkez.net/static/187/doc/spec=2fregexp.html