正则表达式 - 替换太慢

Regex - Replace is too slow

在我的 Rss Feeds 阅读系统上,我需要删除任何现有的脚本块,因为有人说这会混淆 XmlReader。

为此,我正在执行我在网上找到的这段代码:

allXml = Regex.Replace(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)", "");

但这太慢了...有什么方法可以执行此操作?我已经尝试先进行匹配,但这同样很慢,如下所示:

Match rgx = Regex.Match(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)");

if (rgx.Success)
    allXml = Regex.Replace(allXml,"(.*)<script type='text/javascript'>.+?</script>(.*)","");

第一个 (.*) 一次抓取整行(因为 * 是一个贪婪的量词),然后开始回溯尝试容纳所有后续模式。如果您的字符串是很长的一行,有几兆字节长,那么对于引擎来说可能会有问题,因为它必须执行很多步骤才能为模式中定义的每个捕获组找到合适的字符串块。

如果你想要一个快速而肮脏的正则表达式修复,丢弃 (.*)s,只使用

string res = Regex.Replace(allXml, "(?s)<script type='text/javascript'>.*?</script>", "")

删除 <script>...</script> 子字符串。请注意 (?s)RegexOptions.Singleline (DOTALL) 修饰符内联等效项,因此 . 也可以匹配换行符。

但是,最好的方法是使用 HTML 解析器,例如 HtmlAgilityPack