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

在javascript中测试正则表达式的最大字符串长度是多少,javascript,regex,Javascript,Regex,如果我传递长度字符串进行检查,我将使用以下正则表达式,regex101.com显示超时消息。有没有理想的长度来测试正则表达式 ^(\d+[\s\r\n\t,]*){1,100}$ 我建议运行拆分,然后确保拆分是一个数字,因此: var test=“123456 789 101112 asdf”; 变量编号=test.split(/\s*,\s*|\s+/); 数字。forEach(函数(n){ 如果(n%1!==0){ 警报(n+“不是整数”); } });灾难性回溯是由于[\s\r\n\t

如果我传递长度字符串进行检查,我将使用以下正则表达式,regex101.com显示超时消息。有没有理想的长度来测试正则表达式

^(\d+[\s\r\n\t,]*){1,100}$

我建议运行拆分,然后确保拆分是一个数字,因此:

var test=“123456 789 101112 asdf”;
变量编号=test.split(/\s*,\s*|\s+/);
数字。forEach(函数(n){
如果(n%1!==0){
警报(n+“不是整数”);
}

});
灾难性回溯是由于
[\s\r\n\t,]
字符类应用了
*
量词,然后将
+
量词设置为整个组。正则表达式回溯到每个数字,搜索可选的空格和逗号,这创造了大量的可能性,引擎在遇到“灾难”之前会尝试这些可能性

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

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

^(?:[0-9]+\s*,\s*){1,100}$
,它将优雅地失败,并与字符串OK匹配

如果末尾的逗号是可选的,请使用

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


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

这是特定于regex101的,而不是一般的js。是否有一个最大长度-否。是否有一个理想的长度-很大程度上取决于您的用例(您重复的内容、您匹配的内容、它运行的位置、可接受的等待时间等)。理想情况下,您应该避免使用正则表达式解析长结构输入。你的要求是什么?我用同样的字符串在JS中尝试了我的浏览器崩溃@ndnI有一个文本区域,用户在其中输入账号,并混合了标签空间、空格、新行等。我想验证数据@stribizhev1)将
var
放在
n
前面的for-in循环中,以防止它进入全局范围。2) 对数组使用for循环或forEach循环。good points@thomas-incorporated(对我来说咖啡脚本太多了…。
[\s\r\n\t]
是多余的,但它不会导致性能问题,比如
(?:\s\r\n\t)
会。正则表达式失败是因为锚点(有100多个逗号分隔的数字),它超时是因为
*
使分隔符成为可选的。将其更改为
+
,然后去掉锚定,它就可以正常工作了。对于可选的量词,我也是这样想的。您想说回溯是由于实际尝试使用
\d+[\s..]*\d+[\s..]*.
而发生的吗?无论如何,
[\s\t\r\n]
仍然是一个问题,请参阅。那篇文章似乎同意我的观点:字符类中的冗余元素不会影响性能。是的,我是说,
*
量词迫使正则表达式引擎在每对数字之间寻找分隔符,从而导致它必须尝试的路径数量实际上是无限的。这违反了我最喜欢的一条经验法则:当你的意思是
+
时,千万不要使用
*
。@venkat7668:你觉得我的方法怎么样?它对你有用吗?@Stribizev:从文章
中,字符类构成了一个实心块,一个原子标记。一旦它匹配了一个角色,你就不会回溯到它来尝试不同的方法使它匹配。放弃它就是放弃。
因此字符类没有问题(尽管在语法上是多余的)。