プロが教える店舗&オフィスのセキュリティ対策術

小数点以上3桁、小数点以下1桁までの数をチェックしたく次のようなスクリプトにしましたが、うまくいきません。
if (str.match(/[0-9]{2,3}[\.]?[0-9]?/)!=null){
// OK
}else{
// NG
}

この正規表現では、"str='50a'"などが、私の浅はかな予想に反して、OKになってしまいます。
何が悪いかご教授よろしくお願いします。

A 回答 (3件)

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]の部分にマッチしないので逆にマッチしなくなる。
    • good
    • 0
この回答へのお礼

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

ありがとうございました。

お礼日時:2006/10/08 17:42

前提条件で確認したいことがあります。



・ある文字列がその条件を満たすことを確認できればよいのか
・小数部は必須か
123 とか 09 とかは許される?
・小数点のみで小数部なしの表記は許されるか?
12. とかは?
・000.0 とかいう表記も許容してよいのか
・文章では整数部三桁までと書かれているが、例示されている正規表現では
整数部は二桁もしくは三桁を受け付けるように見える。どちらが正しい?



あと、[] の中では . は特殊な意味を持ちませんのでエスケープの必要はありません。[.] か \. でOKです。
また、繰り返し指定で {1} とするのは意味がないです。単にその部分
正規表現が存在するということだけですから。
    • good
    • 0
この回答へのお礼

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

ありがとうございました。

お礼日時:2006/10/08 17:44

'50a'は'0-9'が2から3個に続く小数点が0または1個、それに続く'0-9'が0または1個という条件にマッチしています。


?は1個含むまたは含まないという意味で、必ず含まないという意味にはなりません。

参考URL:http://www.openspc2.org/JavaScript/data/regexp.h …
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/08 17:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!