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

Nil*_*hal 1 regex jquery internet-explorer

我已经写了一堆代码,对支出金额(有效条目32.4554,234,324.34等等).我还编写了代码来限制用户输入超过13位数(不包括.,).

所有这些在Firefox中完美运行.但是在IE 8中,在数字位数超过13之后,如果输入了一个字母,Internet Explorer就会挂起并崩溃!调试时我注意到它在正则表达式线上出错,但同样的正则表达式工作正常,直到没有超过13的限制!Regexperts,拜托!给我看灯!

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;
});
Run Code Online (Sandbox Code Playgroud)

ste*_*ema 5

我很确定这是一个灾难性的回溯案例.你的正则表达式有太多的可能性来检查,直到它失败.

问题在于这一部分

([1-9]*[0-9]*,?[0-9]*)*
Run Code Online (Sandbox Code Playgroud)

而且我很确定它没有按照你的期望做到.

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

/^[1-9]*[0-9,]*(\.[0-9]+)?$/
Run Code Online (Sandbox Code Playgroud)

它仍然允许像1 ,,,,,,,.123这样的东西,但比你的好多了.如果您想禁止此类事情,您需要澄清您的要求.