Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式导致脚本无响应_Javascript_Regex_Infinite Loop - Fatal编程技术网

Javascript正则表达式导致脚本无响应

Javascript正则表达式导致脚本无响应,javascript,regex,infinite-loop,Javascript,Regex,Infinite Loop,我有一个正则表达式: var reg = /^(\w+ ?)+&(\w+ ?)+$/; 这个字符串: var string = "number number number number number number number&"; 当我执行: reg.test(string); 这会导致脚本消息没有响应。我认为这是由于灾难性的回溯()造成的,但我找不到另一种方法来编写我的正则表达式。它只需匹配两组任意数量的小写单词,由空格字符分隔,由“&”字符分隔 一些例子: reg.t

我有一个正则表达式:

var reg = /^(\w+ ?)+&(\w+ ?)+$/;
这个字符串:

var string = "number number number number number number number&";
当我执行:

reg.test(string);
这会导致脚本消息没有响应。我认为这是由于灾难性的回溯()造成的,但我找不到另一种方法来编写我的正则表达式。它只需匹配两组任意数量的小写单词,由空格字符分隔,由“&”字符分隔

一些例子:

reg.test("string&number") //returns true
reg.test("string number&number") //returns true
reg.test("string number&string date") //returns true
reg.test("&string") //returns false
reg.test("string number&") //returns false

如果您这样构造它,它将消除灾难性的回溯:

var reg = /^(\w+)( \w+)*&(\w+)( \w+)*$/;
该键正在将
(\w+?)+
更改为
(\w+)(\w+)*
,因此只有一种方法可以解析该正则表达式的字符串。要查看原始表达式中的问题,让我们看一下字符串<代码>“编号”<代码>和表达式<代码> /(\W++)+/<代码>。您的目的是通过此正则表达式将字符串分为
“number”
“number”
,但是,
/(\w+?)/
也可以单独匹配每个字母,这使得表达式不明确。另一方面,
/(\w+)(\w+)*/
只能以一种方式匹配
“number”
,因为在第二个子模式的每次迭代开始时都需要一个空格

在这里测试:

函数testRegExp(){ var rStr=''; 试一试{ var reg=new RegExp($('#r').val()); rStr+=reg.test($('#t').val()); }捕获(e){ rStr='正则表达式错误'; } $('结果').val(rStr); } $('input')。on('input',testRegExp); testRegExp()
标签{
宽度:80px;
显示:内联块;
}
输入t,输入r{
宽度:50%;
}


字符串:

RegExp:

字符串:

强制使用空格?是的,这是正确的。空格是可选的,这是导致正则表达式不明确的原因。解决方法是将第一个子表达式分成两个,其中一个需要空格。很好!请注意,您也可以去掉最后一个组中的可选空格:
(\w+(?:$)+$
使用
(?:$)
而不是
(|$)
的目的是什么?另外,在这种情况下,您真的需要结尾处的
$
吗?
(|&)
可以更改为
[&]
。在没有优化的情况下,字符类通常在两个字符之间执行,而不是交替执行。你错过了结尾的
$
(艾伦·摩尔的评论中有)。
$
在结尾很重要,因为没有任何东西表明重复会以匹配的
\w+$
终止。将(|&)替换为[&]是一个好的举动。谢谢你的建议。我将在我的回答中解决这个问题。
(?:…)
是一个非捕获组。除非您真的想捕获某些内容,否则您应该始终优先使用那些内容。至于最后一个锚(
$
),是的,您仍然需要它;我添加的那个并不能确定整个比赛。没有它,您可以匹配字符串,如
number&number!@#$%^。它不会消耗垃圾角色,但它们的存在会导致匹配失败,而且不会。