在javascript中测试正则表达式的最大字符串长度是多少?

what is max length of string to test regular expression in javascript

本文关键字:字符串 多少 javascript 测试 正则表达式      更新时间:2023-09-26

我使用以下正则表达式,如果我通过长度字符串检查,regex101.com显示超时消息。是否有理想的长度来测试正则表达式?

^('d+['s'r'n't,]*){1,100}$
https://regex101.com/r/eC5qO7/1

我建议运行分割,然后确保分割的是一个数字,所以:

var test = "123,456 789		101112 asdf";
var numbers = test.split(/'s*,'s*|'s+/);
numbers.forEach(function(n) {
    if (n % 1 !== 0) {
        alert(n + " is not an integer");
    }
});

灾难性回溯是由于['s'r'n't,]字符类对其应用了*量词,然后对整个组设置了+量词。regex回溯到每个数字来搜索可选的空格和逗号,这创造了大量的可能性,引擎在遇到"灾难"之前尝试。

此外,还有一个潜在的瓶颈:字符类中的's也可以匹配'r'n't。.

如果没有原子群和所有量词,正则表达式优化只能通过使其中一个"分隔符"成为强制性来实现。在这种情况下,它显然是一个逗号(从示例字符串判断)。由于您只想验证用逗号和可选空格分隔的输入数字的数量,因此可以使用更简单的正则表达式:

^(?:[0-9]+'s*,'s*){1,100}$

这里,它优雅地失败了,这里它匹配字符串OK。

如果逗号可选,则使用

^(?:'d+'s*,'s*){1,99}'d+,?'s*$

看到演示

还要注意,您不需要i修饰符,因为模式中没有字母。