正则表达式运行太慢

时间:2017-10-30 09:53:48

标签: c# regex

我有这段代码,但它会破坏所有代码。 知道如何重写这个更有效吗?

Regex.Replace(text, @".+[a-zA-Z0-9]{17,500}.+(\r\n)", Environment.NewLine, RegexOptions.Compiled);

1 个答案:

答案 0 :(得分:1)

.+[a-zA-Z0-9]{17,500}.+(\r\n)模式的效率非常低,因为第一个.+子模式一次抓取整条线,然后回溯以适应17的字符串(是的,检查了17个字符,然后是正则表达式引擎称它为一天)字母数字字符。这是一项代价高昂的操作。

你应该重新考虑这种方法。而不是使用Regex.Replace拆分文本(如果你有一个大的多线字符串)与换行符来获得一行数组,或者 - 如果你正在读取文件 - 逐行读取它,并检查每个字符串(列表/数组中的项目或行)都带有一个简单的

Regex.IsMatch(line, "[a-zA-Z0-9]{17}")

仅检查17个连续的ASCII字母数字字符或 - 实际上强制限制17到500个这样的字符:

Regex.IsMatch(line, @"(?<![a-zA-Z0-9])[a-zA-Z0-9]{17,500}(?![a-zA-Z0-9])")

如果找到匹配项,请跳过项/行,否则,将其添加到稍后string.Join("\n", resulting_list)的输出/结果数组中。

(?<![a-zA-Z0-9])确保前面的char不是ASCII字母数字字符,(?![a-zA-Z0-9])对以下字符进行相同的检查。