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

Javascript regex causes unresponsive script

本文关键字:脚本 响应 正则表达式 Javascript      更新时间:2023-09-26

我有这个正则表达式:

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 Moorenhahtdh在评论中指出,这个表达实际上可以像这样稍微简化:

var reg = /^('w+[ &])+('w+( |$))+$/