C#多个正则表达式替换字符串 – 太多内存
基本上我想做的是在单个字符串上运行多个(15-25)正则表达式替换,以实现最佳的内存管理.
概述: 正则表达式是半复杂的,但需要文件的多行(例如,识别书的部分),因此任意破坏字符串,或者在每个下载循环上运行替换都是不可能的. 替换样本: Regex re = new Regex("<A.*?>Table of Contents</A>",RegexOptions.IgnoreCase); source = re.Replace(source,""); 随着每次运行更换内存天空火箭,我知道这是因为字符串在C#中是不可变的并且它需要复制 – 即使我调用GC.Collect()它仍然对30MB文件没有帮助. 有关更好的接近方法的建议,或使用常量内存执行多个正则表达式替换的方法(制作2个副本(内存为60MB),执行搜索,将副本丢弃回30MB)? 更新: 似乎没有一个简单的答案,但对于未来的人来说,我最终使用下面所有答案的组合使其达到可接受的状态: >如果可能的话,将字符串分成块,请参阅manojlds的答案,以便在读取文件时找到合适的终点. 谢谢你们! 解决方法
根据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 ""; } }); 当然,如果后面的模式需要能够匹配早期替换的结果,那么这就会分崩离析. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |