为什么此代码卡住 node.js - Javascript 上的错误?
Why this code stuck node.js - Bug on Javascript?
我正在尝试 运行 这个正则表达式,但它卡住了我的控制台。为什么?
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]*)+)
部分,您的正则表达式导致 catastrophic backtracking (see a demo of your regex here)。由于 [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*
可以匹配零个字符,你基本上有一个经典的 (a+)+
-like 模式(cf: ([\u00C0-\u1FFF\u2C00-\uD7FF]+)+
)导致回溯问题。
要摆脱它,您需要确保子模式在分组内是强制,并对整个分组应用*
量词:
^([\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$
此处,[\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*
匹配:
[\u00C0-\u1FFF\u2C00-\uD7FF]+
- [\u00C0-\u1FFF\u2C00-\uD7FF]
范围内的一个或多个字符
(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*
- 零个或多个序列:
[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+
- a-z\u00C0-\u1FFF\u2C00-\uD7FF
范围 以外的一个或多个字符
[\u00C0-\u1FFF\u2C00-\uD7FF]+
- \u00C0-\u1FFF\u2C00-\uD7FF
范围内的一个或多个字符。
我正在尝试 运行 这个正则表达式,但它卡住了我的控制台。为什么?
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]*)+)
部分,您的正则表达式导致 catastrophic backtracking (see a demo of your regex here)。由于 [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*
可以匹配零个字符,你基本上有一个经典的 (a+)+
-like 模式(cf: ([\u00C0-\u1FFF\u2C00-\uD7FF]+)+
)导致回溯问题。
要摆脱它,您需要确保子模式在分组内是强制,并对整个分组应用*
量词:
^([\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$
此处,[\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*
匹配:
[\u00C0-\u1FFF\u2C00-\uD7FF]+
-[\u00C0-\u1FFF\u2C00-\uD7FF]
范围内的一个或多个字符(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*
- 零个或多个序列:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+
-a-z\u00C0-\u1FFF\u2C00-\uD7FF
范围 以外的一个或多个字符
[\u00C0-\u1FFF\u2C00-\uD7FF]+
-\u00C0-\u1FFF\u2C00-\uD7FF
范围内的一个或多个字符。