3

2の精度まで正の小数を検証しようとしている正規表現をテストするJavascript関数があります。

function isPositiveDecimalPrecisionTwo(str) {
    return /^\d*(\.\d{1,2}$)?/.test(str);
}

コードから呼び出すと、期待した結果が得られません。

例えば:

var a = isPositiveDecimalPrecisionTwo("1");         //   expect t, returns t
var b = isPositiveDecimalPrecisionTwo("1.2");       //   expect t, returns t
var c = isPositiveDecimalPrecisionTwo("1.25");      //   expect t, returns t
var d = isPositiveDecimalPrecisionTwo("1.257");     // * expect f, returns t *
var e = isPositiveDecimalPrecisionTwo("1.2575");    // * expect f, returns t *
var f = isPositiveDecimalPrecisionTwo(".25");       // * expect t, returns f *
var g = isPositiveDecimalPrecisionTwo("d");         //   expect f, returns f
var h = isPositiveDecimalPrecisionTwo("d1");        //   expect f, returns f
var i = isPositiveDecimalPrecisionTwo("1d");        // * expect f, returns t *
var j = isPositiveDecimalPrecisionTwo("1d1");       // * expect f, returns t *
var k = isPositiveDecimalPrecisionTwo("-1");        //   expect f, returns f
var l = isPositiveDecimalPrecisionTwo("-1.5");      //   expect f, returns f

3つの問題があります:

  1. 「1.257」または「1.2575」を検証するとtrueが返されますが、\d{1,2}
  2. 「.25」を検証するとfalseが返されますが、^\d*
  3. 「1d」または「1d1」を検証するとtrueが返されます。\.適切にエスケープされた「。」のように見えるときは、任意の文字として読んでいるように見えます。(ドット)。

ただし、regexpal.comのようなツールを使用すると、同じregexpが期待どおりに検証されているように見えます。

http://regexpal.com/?flags=g®ex=%5E%5Cd%2B(%5C.%5Cd%7B1%2C2%7D%24)%3F&input=

私は何が欠けていますか?

4

2 に答える 2

7

問題は、あなた$が括弧内にあることです。あなたはそれがグループの後にあることを望みます。

/^\d*(\.\d{1,2})?$/

これは期待どおりに動作するはずです。

内部では、文字列 ( ) の末尾が「オプション」$であるため、数字で始まるすべてのものに一致していました。$

于 2012-11-14T15:21:22.680 に答える
2

?エスケープされた小数点の後にa を追加するだけで、小数部分をグループ化せずにそれを行うこともできます

^\d*\.?\d{1,2}$
于 2012-11-14T16:16:03.983 に答える