• ベストアンサー

正規表現について

小数点以上3桁、小数点以下1桁までの数をチェックしたく次のようなスクリプトにしましたが、うまくいきません。 if (str.match(/[0-9]{2,3}[\.]?[0-9]?/)!=null){ // OK }else{ // NG } この正規表現では、"str='50a'"などが、私の浅はかな予想に反して、OKになってしまいます。 何が悪いかご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

JavaScriptには詳しくないですが、perlだとこういう正規表現でお望み(と思われる)挙動になりました。 [0-9]{2,3}[\.][0-9]){1}([^0-9]|$) --- ? は先行文字クラスが0-1文字の意味だから、 [0-9]{2,3}[\.]?[0-9]? では、 - [\.]?は小数点があってもなくてもOKになる - 同じく[0-9]?だと0から9があってもなくてもOKなので 結局、数字2~3桁と0文字以上の文字列すべてにマッチする。だから50aにもマッチする。 - [0-9]{2,3}[\.][0-9]){1} こうすると良さそうに見えるが、12.34 にもマッチするする。つまり、12.3までマッチし、小数点以下2位の4があってはいけないという表現がなされていないので。 - [0-9]{2,3}[\.][0-9]){1}[^0-9] これも12.1で改行の場合、[^0-9]の部分にマッチしないので逆にマッチしなくなる。

pokapoka1980
質問者

お礼

丁寧な回答&挙動までチェック頂き大変感謝です。 多少違いますが、指定頂いた正規表現を参考に作り直したところ、望んだ挙動を得ました。 ありがとうございました。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

前提条件で確認したいことがあります。 ・ある文字列がその条件を満たすことを確認できればよいのか ・小数部は必須か 123 とか 09 とかは許される? ・小数点のみで小数部なしの表記は許されるか? 12. とかは? ・000.0 とかいう表記も許容してよいのか ・文章では整数部三桁までと書かれているが、例示されている正規表現では 整数部は二桁もしくは三桁を受け付けるように見える。どちらが正しい? あと、[] の中では . は特殊な意味を持ちませんのでエスケープの必要はありません。[.] か \. でOKです。 また、繰り返し指定で {1} とするのは意味がないです。単にその部分 正規表現が存在するということだけですから。

pokapoka1980
質問者

お礼

回答、頂いたところ大変恐縮ですが、 とりあえず解決したため確認の返答はご容赦下さい。 ありがとうございました。

回答No.1

'50a'は'0-9'が2から3個に続く小数点が0または1個、それに続く'0-9'が0または1個という条件にマッチしています。 ?は1個含むまたは含まないという意味で、必ず含まないという意味にはなりません。

参考URL:
http://www.openspc2.org/JavaScript/data/regexp.html
pokapoka1980
質問者

お礼

回答ありがとうございます。 参考になりました。

関連するQ&A