当前位置: 首页 > 面试题库 >

Javascript正则表达式挂起(使用v8)

唐彬炳
2023-03-14
问题内容

我正在使用此正则表达式获取文件中标签的内容。

var regex = new RegExp("<tag:main>((?:.|\\s)*)</tag:main>");

这导致v8引擎无限期挂起。

现在,如果我使用new RegExp("<tag:main>([\s\S]*)</tag:main>"),一切都很好。

有人知道第一个为什么花太长时间吗?


问题答案:

灾难性地回溯了最后一个结束</tag:main>标记之后出现的长序列空格。考虑主题字符串以100个空格结尾的情况。首先,将它们与.交替项左侧的匹配。失败是因为没有结束标记,因此它尝试将最后一个字符与\s代替匹配。这也失败了,因此它尝试将倒数第二个空格作为a匹配最后\s一个空格作为a
.。失败(仍然没有结束标记),因此它将最后一个空格作为尝试\s。如果失败,则将倒数第二个空格与a
\s匹配,并尝试所有4种方式来匹配最后两个空格。如果失败,它将尝试倒数第二个空格作为\s以及最后3个空格的所有8种方式。然后是16、32等。宇宙在到达倒数第100个空间之前就结束了。

由于灾难性的回溯,不同的虚拟机对正则表达式匹配的反应不同,这些匹配永远持续下去。有些人会简单地报告“不匹配”。在V8中,这就像编写任何其他无限或接近无限的循环一样。

使用非贪婪*可以完成您想要的操作(您要在第一个</tag:main>而不是最后一个位置停止),但是对于缺少终止序列的长字符串空间仍然会发生灾难性的回溯。

确保内括号中的相同字符不能与交替符的两边都匹配,可以将问题从指数形式的一个减少到一个在字符串长度上线性的问题。使用字符类代替替代字符,或将其\n放在替代条的右侧。
\n是不相交的,.因此如果您遇到了较长的空格序列,则regexp引擎在终止之前不会尝试所有左右,左,右等组合。



 类似资料:
  • 行动时刻 - 使用正则表达式 Unlang允许在条件检查中进行正则表达式计算。这些通常是Posix正则表达式。运算符=〜和!〜与正则表达式相关联。为了简单的概念证明,我们将修改上一个练习: 1.编辑FreeRADIUS配置目录下的sites-available / default虚拟服务器,并在该部分顶部的post-auth部分中添加以下内容: if(request:Framed-Protocol

  • 问题内容: 如何在JavaScript中使用支持Unicode的正则表达式? 例如,应该有类似的东西可以匹配Letters或Marks类别中的任何代码点(而不仅仅是ASCII的),并且希望具有这样的过滤器来标点,等等。 问题答案: ES 6的情况 即将发布的ECMAScript语言规范,版本6,包含可识别Unicode的正则表达式。必须使用u正则表达式上的修饰符启用支持。请参阅ES6中支持Unic

  • 正则练习 1.生成一个正则表达式regexObj 描述字符串规则的表达式,两种方式 直接量: /pattren/attrs(/规则/属性) 对象构造方式:new RegExp(pattern,arrtes) (/规则/属性) 2.regexObj.test(str) 测试正则表达式regexObj与指定字符串是否匹配 /10086/.test('10086') //true /10086/.tes

  • sorter: "${$(...props)=>{timeSort(createTime)}$}$", ..$}$"."${$.. 希望结果 :sorter: (...props)=>{timeSort(createTime)}, ..$}$"."${$.. 规则: "${$ 和 $}$" 是一对,将他们替换为空。

  • 问题内容: 我写了一个正则表达式来从HTML提取字符串,但是多行标志似乎不起作用。 这是我的模式,我想在标签中获取文本。 我创建了一个字符串来测试它。当字符串包含“ \ n”时,结果始终为null。如果删除所有的“ \ n”,无论有没有标志,它都会给我正确的结果。 我的正则表达式怎么了? 问题答案: 您正在寻找修饰符,也称为 dotall 修饰符。它将强制点也匹配换行符,默认情况下 不这样做 。

  • 问题内容: 我正在做一个小的javascript方法,该方法会接收到一个点列表,并且我必须阅读这些点才能在Google地图中创建多边形。 我在表格上收到这些要点: (lat,long),(lat,long),(lat,long) 因此,我完成了以下正则表达式: 我已经使用RegexPal和收到的确切数据进行了测试: 并且它可以正常工作,所以为什么当我在JavaScript中添加此代码后,结果中会收