【问题标题】:How to validate both integer and decimal values using regular expression?如何使用正则表达式验证整数和十进制值?
【发布时间】:2016-03-22 09:36:18
【问题描述】:

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

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

我测试的值是:6666666.666

但结果总是不匹配。

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

------------ JQuery函数---------- --------------

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');
        }
    }

}

【问题讨论】:

  • 交替周围的空格是复制/粘贴错误吗?如果没有,请删除它们。
  • 为什么不单独检查长度呢? if ((sender.value+"").length <= 11)
  • @Uchiha 这很好!
  • 谢谢@bobblebubble

标签: jquery regex


【解决方案1】:

如果您只想使用正则表达式,一个想法是使用否定的lookahead 来检查最大长度。

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

See demo at regex101

【讨论】:

  • 我在上面的函数中插入了上面提到的表达式,但仍然re.test(sender.value) 总是返回 false...
  • @Kaishu 试试/^-?(?!.{12})\d+(?:\.\d+)?$/.test(sender.value)works fine (fiddle)
  • 这行得通,那么我使用它的功能有什么问题?
  • @Kaishu 如果与new RegExp 一起使用需要更多转义:var re = new RegExp('^-?(?!.{12})\\d+(?:\\.\\d+)?$'); see fiddle
【解决方案2】:

首先,. 是正则表达式中的一个特殊字符,它与 任何 字符匹配,因此您的表达式匹配得比您预期的要多。

更重要的是,您要明确查找小数点前的 {0,9} 和小数点后的 {0,2} 字符,而您给出的 6666666.666 的示例有两个以上的小数。

为什么不简单

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

让正则表达式担心数字和格式并分别处理长度。长度很容易检查,而无需使用正则表达式变体。

【讨论】:

  • 这对于其他字段没问题,但还有像latitudelongitude 这样的其他字段,我分别使用格式为 99.999999999 和 999.999999999999 来限制用户,但是这种情况允许这些字段取整数部分超过 2 位和 3 位的纬度和经度...如何处理这些组合条件。?
  • 您不能对“小数点前后的任意位数,只要总长度为 11 个或更少字符”和“任意数量的字符长但只有两个或小数点前三位”。为一个编写一个测试,为另一个编写一个完全独立的测试。 (在后一种情况下是/^[0-9]{2,3}(\.[0-9]+)$/
  • 我不知道为什么它允许值为 (111.) 。由于我们限制在小数点后插入至少一位数字,因此它仍然允许小数点后为空的小数部分。
  • 我的表达式明确以? 结尾,因此不需要小数部分。如果您需要它,请不要在那里使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2016-07-02
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
相关资源
最近更新 更多