如何使用正则表达式验证整数和十进制值?

时间:2016-03-22 09:36:19

标签: jquery regex

允许同时将IntegerDecimal作为输入。并限制总长度不应大于11(包括小数点的最大输入长度) 例如。允许的值是     1.0,1.123546,12345678912,12.12345678,...等。 即如果值包含Decimal点,则在digit点之后允许至少一个Decimal,否则允许具有最大长度的完整整数,即11

我已将正则表达式声明为: /^-?(([0-9]{0,11}) | ([0-9]{0,9}.[0-9]{1,2}))$/

我正在测试的值为:6666666.666

但结果总是无法匹配。

注意:如果小数点前的数字长度为7,则小数点后允许3位数,以防最大允许长度为11。       Fractional部分长度根据integral部分确定。

------------------------ JQuery Function --------------------- --------------

function Validate(sender, precision)
{
    var variable;
    if (precision != "0") 
    {
        var valueLength = sender.value.indexOf('.');
        if (sender.id.indexOf("Longitude") > -1)
            variable = "-?[0-9,]{0," + parseInt($(sender).attr("data-length") - (parseInt(precision) + 1)) + "}[.][0-9]{0," + parseInt(precision) + "}$";
        else
        variable = "-?(([0-9]{0," + parseInt($(sender).attr("data-length")) + "})|([0-9]{0," + parseInt($(sender).attr("data-length") - 2) + "}.[0-9]{1," + parseInt

        ($(sender).attr("data-length") - (valueLength + 2)) + "}))$";
    }
    else
        variable = "-?[0-9,]{0," + parseInt($(sender).attr("data-length")) + "}$";
        var re = new RegExp('^' + variable);
    if (sender.value != "") 
    {
        if (!re.test(sender.value)) 
        {
            alert('Not Matched');
        }
        else
        {
            alert('Matched');
        }
    }

}

2 个答案:

答案 0 :(得分:2)

首先,.是正则表达式中的一个特殊字符,匹配 任何 字符,因此您的表达式匹配的次数超出了您的预期。

更重要的是,您明​​确地在小数点前查找{0,9}个字符,在{0,2}后明确查找,6666666.666给出的示例的小数位数超过两位。

为什么不简单

if (/^[0-9]+(\.[0-9]+)?$/.test( sender.value ) && sender.value.length <= 11) ...

让正则表达式担心数字和格式并分别处理长度。长度 easy 可以检查而不会出现正则表达式变化。

答案 1 :(得分:1)

如果您只想使用正则表达式,我们的想法是使用负lookahead来检查最大长度。

^-?(?!.{12})\d+(?:\.\d+)?$
  • ^-? optional连字符^ start
  • (?!.{12})前瞻检查前方any characters是否不超过11​​个。
  • \d+匹配一个或多个\d short数字[0-9]
  • (?:\.\d+)?后跟一个可选的group,其中包含一个点后跟一个或多个数字。
  • $匹配结束

See demo at regex101