C#多个正则表达式替换字符串 – 太多内存

C#多个正则表达式替换字符串 – 太多内存,第1张

概述基本上我想做的是在单个字符串上运行多个(15-25)正则表达式替换,以实现最佳的内存管理. 概述: 通过ftp附加到StringBuilder以获取非常大的字符串,将文本文件(有时是html)流式传输.文件大小范围从300KB到30MB. 正则表达式是半复杂的,但需要文件的多行(例如,识别书的部分),因此任意破坏字符串,或者在每个下载循环上运行替换都是不可能的. 替换样本: Regex re = 基本上我想做的是在单个字符串上运行多个(15-25)正则表达式替换,以实现最佳的内存管理.

概述:
通过ftp附加到StringBuilder以获取非常大的字符串,将文本文件(有时是HTML)流式传输.文件大小范围从300KB到30MB.

正则表达式是半复杂的,但需要文件的多行(例如,识别书的部分),因此任意破坏字符串,或者在每个下载循环上运行替换都是不可能的.

替换样本:

Regex re = new Regex("<A.*?>table of Contents</A>",RegexOptions.IgnoreCase);source = re.Replace(source,"");

随着每次运行更换内存天空火箭,我知道这是因为字符串在C#中是不可变的并且它需要复制 – 即使我调用GC.Collect()它仍然对30MB文件没有帮助.

有关更好的接近方法的建议,或使用常量内存执行多个正则表达式替换的方法(制作2个副本(内存为60MB),执行搜索,将副本丢弃回30MB)?

更新:

似乎没有一个简单的答案,但对于未来的人来说,我最终使用下面所有答案的组合使其达到可接受的状态:

>如果可能的话,将字符串分成块,请参阅manojlds的答案,以便在读取文件时找到合适的终点.
>如果你不能像流一样进行拆分,至少可以在以后拆分 – 请参阅ChrisWue的一些外部工具的答案,这些工具可能有助于管理文件.
>优化正则表达式,避免贪婪的运算符,并尝试尽可能限制引擎必须做的事情 – 请参阅Sylverdrag的回答.
>尽可能结合正则表达式,这减少了正则表达式不相互依赖时的替换次数(在这种情况下用于清除错误输入) – 请参阅Brian Reichle对代码示例的回答.

谢谢你们!

解决方法 根据RegEx的性质,您可以将它们组合成单个正则表达式,并使用带有MatchEvaluator委托的Replace()重载来确定匹配字符串的替换.
Regex re = new Regex("First Pattern|Second Pattern|Super(Mega)*Delux",RegexOptions.IgnoreCase);source = re.Replace(source,delegate(Match m){    string value = m.Value;    if(value.Equals("first pattern",StringComparison.OrdinalignoreCase)    {        return "1st";    }    else if(value.Equals("second pattern",StringComparison.OrdinalignoreCase)    {        return "2nd";    }    else    {        return "";    }});

当然,如果后面的模式需要能够匹配早期替换的结果,那么这就会分崩离析.

总结

以上是内存溢出为你收集整理的C#多个正则表达式替换字符串 – 太多内存全部内容,希望文章能够帮你解决C#多个正则表达式替换字符串 – 太多内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存