.NET Regex需要很长时间才能找到匹配项

时间:2017-03-29 12:25:52

标签: c# regex

为什么这个看起来无辜的正则表达式会杀死我的请求?

const links = new Set;
const skip = [];

list.forEach( (v, i) => {
    v.forEach( j => {
        if (skip.indexOf(j) === -1) {
            links.add([i, j]);
        }
    })
    skip.push(i);
})

这是catastrophic backtracking的候选人吗?

在.NET framework 4.5.2,C#

上运行

1 个答案:

答案 0 :(得分:2)

要匹配文字点,您必须将其转义。如果不这样做,量化的组([\d\w-]+.){6}将导致具有更长输入的灾难性回溯。更改为([\w-]+\.){6}hi

请注意[\d\w-]+匹配1个或更多(未知数字)字母,数字,_-.匹配任何字符。应用量词时,正则表达式引擎会尝试所有可能的方法来匹配字符串,然后才能失败。找到匹配项的字符串通常不会出现问题,它通常发生在无法找到匹配项的字符串中,因为尝试了所有可能的方法(直到引擎报告崩溃)。

此外,\d模式匹配数字,\w匹配数字,因此在字符类中使用两者都没有意义。