繁体   English   中英

使用正则表达式验证货币时,IE 8崩溃

[英]IE 8 crashes when using regex with to validate currency

我已经写了一堆代码,对支出金额(有效条目32.4554234,324.34等)。 我另外编写了代码,以限制用户输入超过13位数字( .,除外)。

所有这些都可以在Firefox中完美运行。 但是在IE 8中,位数超过13后,如果输入字母,Internet Explorer将挂起并崩溃! 在调试时,我注意到它在正则表达式行中出错,但是在未超过13的限制之前,相同的正则表达式可以正常工作! 正则专家,请! 给我看看光!

function isIncorrectSpend(cubeCurrencySpend) {  
    if(!(/^([1-9]*[0-9]*,?[0-9]*)* (\.[0-9]*)?$/.test(cubeCurrencySpend))) {
        return true;
    }
    return false;
}

function isLongerThanThirteenDigits(cubeCurrencySpend) {
    cubeCurrencySpend = cubeCurrencySpend.replace(/,/g, "").replace(/\./g, "");
    if(cubeCurrencySpend.length>12) { 
        return true;
    }
    return false;
}

jQuery("input#minval").keyup( function() {
    if(isIncorrectSpend(jQuery("input#minval").val())) {
        jQuery("input#minval").val("");
        alert("please enter correct spend value");
    }        
});
jQuery("input#minval").keypress( function(e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if(isLongerThanThirteenDigits(jQuery("input#minval").val()) && (code > 47 && code < 58)) {
        alert("Please enter a number less than 13 digits");
        return false;
    }
    return true;
});

我很确定这是灾难性的回溯 您的正则表达式有太多检查的可能性,直到失败为止。

问题是这部分

([1-9]*[0-9]*,?[0-9]*)*

而且我很确定它没有按照您的期望做。

这将匹配相同的东西,但是会更快地失败:

/^[1-9]*[0-9,]*(\.[0-9]+)?$/

它仍然允许1,。,。,。123之类的东西,但比您的要好得多。 如果您不想这样做,则需要澄清您的要求。

您还可以更改正则表达式以结合长度和有效性检查。

function isIncorrectSpend(cubeCurrencySpend) {  
     return !/^(?!0)(?:\d[,\.]*){1,13}$/.test(cubeCurrencySpend);              
}

该答案假定您希望验证满足以下条件的十进制“数字”:

“数字”的定义

  • 至少必须有一位数字,并且所有数字都必须为十进制(从0到9)。
  • 整数部分和小数部分都是可选的,但一个或另一个必须存在。
  • 小数部分(如果存在)可以具有任意数量的数字,但始终以小数点开头。
  • 如果整数部分的位数不止一位,则前导位数不得为零。
  • 如果整数部分的位数超过三位数,则可以使用逗号将整数分成三位数。
  • 数字可以以可选符号开头,可以是加号+或减号-
  • 不允许使用空格。
  • 不允许使用指数部分。

鉴于上述要求,这里有一些有效和无效的数字

有效的“数字”:

0
0.
.0
0.0
1
+1
-1
1234
123456
1,234
12,345
123,456
123,456.7890

无效的“数字”:

0FA92      // Invalid digit. Must be 0-9.
0123       // Multi-digit integer must lead with non-zero.
.          // Must have at least one digit.
1,23,4     // Commas must separate triplets of digits.
12345,678. // Missing comma.
+  10      // Whitespace not allowed.
1.2E34     // Exponents not allowed.

这是一个正则表达式(首先使用Python方便的原始字符串语法以带注释的自由行模式格式显示),该正则表达式与满足上述要求的数字匹配:

正则表达式以验证“数字”

r"""
^          # Anchor to start of string.
[+\-]?     # Optional sign.
(?=\.?\d)  # Must have at least one digit.
(?:        # Optional integer part. Either...
  [1-9]    # A sequence of digits w/no commas.
  \d*      # (but first digit is not zero.)
|          # or an integer having commas...
  [1-9]    # First digit is not zero.
  \d{0,2}  # 1,2 or 3 digits ahead of 1st comma.
  (?:      # One or more comma + 3 digits.
    ,      # Comma separates
    \d{3}  # digit triplets.
  )+       # One or more comma + 3 digits.
| 0        # or integer part may be just zero.
)?         # Optional integer part.
(?:        # Optional fractional part.
  \.       # Dot separates
  \d*      # zero or more fraction digits.
)?         # Optional fractional part.
$          # Anchor to end of string.
"""

这是一个实现上述正则表达式的JavaScript函数:

函数isValidNumber()

function isValidNumber(text) {
    var re = /^[+\-]?(?=\.?\d)(?:[1-9]\d*|[1-9]\d{0,2}(?:,\d{3})+|0)?(?:\.\d*)?$/;
    if((re.test(text))) return 'true';
    return 'false';
}

请注意,在用户输入完完整的数字之后,您才应该尝试验证数字。 对每个按键都调用验证功能(就像上面的代码似乎正在做的那样)不是IMHO的好习惯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM