Javascript 正则表达式会导致脚本无响应
Javascript regex causes unresponsive script
我有这个正则表达式:
var reg = /^('w+ ?)+&('w+ ?)+$/;
和这个字符串:
var string = "number number number number number number number&";
当我执行时:
reg.test(string);
这会导致脚本消息无响应。我认为这是由于灾难性的回溯(http://www.regular-expressions.info/catastrophic.html),但我找不到另一种方法来编写我的正则表达式。它必须匹配两组由空格字符分隔的任意数量的小写单词,由"&"字符分隔。
一些例子:
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+)*
,以便只有一种方法可以解析该正则表达式的字符串。 要看到原始表达式中的问题,让我们看一下字符串"number number"
和表达式/('w+ ?)+/
。 您的目的是通过此正则表达式将字符串分解为"number "
和"number"
,但是,/('w+ ?)/
也可以单独匹配每个字母,这使您的表达式不明确。 另一方面,/('w+)( 'w+)*/
只能以一种方式匹配"number number"
,因为在第二个子模式的每次迭代开始时都需要一个空格。
在这里测试一下:
function testRegExp() {
var rStr = '';
try {
var reg = new RegExp($('#r').val());
rStr += reg.test( $('#t').val() );
} catch( e ) {
rStr = 'regex error';
}
$('#result').val( rStr );
}
$('input').on( 'input', testRegExp );
testRegExp();
label {
width: 80px;
display: inline-block;
}
input#t, input#r {
width: 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
<label>String: </label>
<input id="t" type="text" value="number number number number number number number&" /></p>
<p><label>RegExp: </label>
<input id="r" type="text" value="^('w+)( 'w+)*&('w+)( 'w+)*$" /></p>
<p>
<label>String: </label>
<input id="result" type="text" disabled="disabled" />
</p>
编辑:Alan Moore和nhahtdh在评论中指出,这个表达实际上可以像这样稍微简化:
var reg = /^('w+[ &])+('w+( |$))+$/
相关文章:
- 真的没有办法在Firefox中自动杀死没有响应的脚本吗
- 如何获取从 AJAX 到脚本的发送响应
- 为什么我的附加组件面板的内容脚本在更改 contentURL 后不再响应端口消息
- 如果HTTP响应为404,脚本标记会被阻塞吗
- 将简单的Perl脚本翻译成Python,向客户端发送响应
- 如何在java脚本中从http响应生成blob
- 在Java(Coffee)脚本中获取响应值
- 当我使用java脚本调用web服务时,模拟器上没有得到响应
- 加速谷歌脚本中的onEdit功能-有时没有响应
- Java脚本将URL的响应读取到变量中
- 避免'脚本没有响应'使用反向AJAX/Comet
- F5负载平衡器附加<脚本>到JSON Ajax响应
- Javascript随机名称猜测者:无响应的脚本问题
- 避免“;无响应脚本"foreach循环中的消息
- jQuery ajax 调用 - jim 脚本响应应该是什么格式
- 如何删除响应式移动设备的脚本
- 如何从 jQuery ajax 响应中删除<脚本>标签
- jQuery 如何导致执行在 AJAX 响应中返回的脚本标记中找到的 JS 代码
- 如何使用 AJAX 获取 CGI 脚本响应
- ReactJS -在渲染前等待第三方脚本响应