为什么这段代码卡住了节点.js - Javascript上的错误

Why this code stuck node.js - Bug on Javascript?

本文关键字:js 节点 Javascript 错误 段代码 代码 为什么      更新时间:2023-09-26

我正在尝试运行这个正则表达式,但它卡住了我的控制台。为什么?

var str = "Шедевры православной музыки - 20 золотых православных песен";
str.match(/^((['u00C0-'u1FFF'u2C00-'uD7FF]+[^a-z'u00C0-'u1FFF'u2C00-'uD7FF]*)+) [a-z]+[^'u00C0-'u1FFF'u2C00-'uD7FF]*$/i);

由于((['u00C0-'u1FFF'u2C00-'uD7FF]+[^a-z'u00C0-'u1FFF'u2C00-'uD7FF]*)+)部分原因,您的正则表达式会导致灾难性的回溯(在此处查看正则表达式的演示(。由于[^a-z'u00C0-'u1FFF'u2C00-'uD7FF]*可以匹配零个字符,因此您基本上具有导致回溯问题的经典(a+)+模式(cf:(['u00C0-'u1FFF'u2C00-'uD7FF]+)+(。

要摆脱它,您需要确保子模式在分组中是强制性的,并对整个分组应用*量词:

^(['u00C0-'u1FFF'u2C00-'uD7FF]+(?:[^a-z'u00C0-'u1FFF'u2C00-'uD7FF]+['u00C0-'u1‌​FFF'u2C00-'uD7FF]+)*) [a-z]+[^'u00C0-'u1FFF'u2C00-'uD7FF]*$

查看正则表达式演示

在这里,['u00C0-'u1FFF'u2C00-'uD7FF]+(?:[^a-z'u00C0-'u1FFF'u2C00-'uD7FF]+['u00C0-'u1‌​FFF'u2C00-'uD7FF]+)*匹配:

  • ['u00C0-'u1FFF'u2C00-'uD7FF]+ - ['u00C0-'u1FFF'u2C00-'uD7FF]范围内的一个或多个字符
  • (?:[^a-z'u00C0-'u1FFF'u2C00-'uD7FF]+['u00C0-'u1‌​FFF'u2C00-'uD7FF]+)* - 零个或多个序列:
    • [^a-z'u00C0-'u1FFF'u2C00-'uD7FF]+ - 除a-z'u00C0-'u1FFF'u2C00-'uD7FF范围字符之外的一个或多个字符
    • ['u00C0-'u1‌​FFF'u2C00-'uD7FF]+ - 'u00C0-'u1‌​FFF'u2C00-'uD7FF范围内的一个或多个字符。