正则表达式 - 替换太慢

时间:2016-11-23 16:39:57

标签: regex rss feed xmlreader rss-reader

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

为此,我在网上找到了这段代码:

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

但这太慢了......有什么方法可以执行此操作?我已经尝试过首先进行比赛,但这同样很慢,就像这样:

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

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

1 个答案:

答案 0 :(得分:1)

第一个(.*)一次抓住整行(因为*是一个贪婪的量词),然后开始回溯试图容纳所有后续模式。如果你的字符串是一个非常长的行,几兆字节长,那么引擎可能会有问题,因为它必须在找到模式中定义的每个捕获组的相应字符串块之前执行许多步骤。

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

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

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

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