我试图运行这个正则表达式,但我的控制台卡住了。为什么?
var str = "Шедевры православной музыки - 20 золотых православных песен";
str.match(/^(([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$/i);
我试图运行这个正则表达式,但我的控制台卡住了。为什么?
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+)+
的模式(参见:([\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
范围内的字符。
(([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+)
部分引起了“灾难性回溯”,导致问题出现。有关“灾难性回溯”的更多详细信息请参见此处。正则表达式的实际要求是什么? - Wiktor Stribiżew^([\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1FFF\u2C00-\uD7FF]+)*) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$
吗? - Wiktor Stribiżew