在C#中跨10,000个文件优化1000个正则表达式搜索

时间:2014-12-16 19:46:10

标签: c# regex

鉴于一个文件有大约1000个单独的正则表达式搜索,必须应用于10,000个其他文件左右,我正在寻找一种不错的方法来在不到一天的时间内完成这项运行。没有搜索和替换,只是直接匹配检查。我可以手动完成并组合其中的许多内容,但我想知道是否有一个自动化工具可以执行此操作,也许可以将其简化为一次搜索。

还想知道这件事是否也被问了1000次,但是我的google-foo让我失败了。

编辑:使用外部工具是可能的,但这必须通过一个脚本运行,其中1000个左右的搜索通过并且所有结果都被编辑成一个漂亮的报告。我在C#中完成了一些事情,但是它很慢,因此结合的想法或其他使它变得更快的方法。顺便说一句,我确实已经有线程了。

3 个答案:

答案 0 :(得分:1)

第一个改进的地方是确保你的循环以正确的顺序嵌套。

循环遍历文件,并为每个文件尝试所有1000种模式,然后再转到下一个文件。这样你只需要打开一次文件,而不是1000次。

第二个想法是使用像flex + yacc + bison这样的解析器生成来预编译覆盖所有模式的单个DFA(确定性有限自动机)。与对整个字典进行匹配可以使用trie的方式相同,通常可以使用状态机来完成与模式列表的匹配,其中计算量比分别匹配每个模式少得多(基本上:一个模式无法匹配的位置和方式)包含有关该区域可能适合的模式的信息)

答案 1 :(得分:1)

找到一些有趣的东西:

这是一个Regex combiner,它运行一个Perl脚本来获取所有字符串并将它们放入一个字符串中来统治所有字符串。

当然,从我的源字符串输出的字符串长度大约是7000个字符,这导致C#的Regex实现在大约1024个字符之后爆炸 - 因为1024个字符都是理智的人所需要的。 2 ^ 10在这里非常神奇。

所以谁知道它在组合后是否运行得更快,因为组合也失败了:)

编辑:嗯,在搜索字符串中删除了一些小的东西(删除\在引号上)并运行它。现在,是时候查看One String的结果是否与1000个字符串的结果相匹配。它似乎确实运行x10更快,这是非常好的!

答案 2 :(得分:0)

我最后退了一步,意识到99%的搜索可以轻松转换为直接字符串搜索,只需要一点点工作,然后使用简单的hashset搜索每个单词。我剩下的剩余搜索需要GREP,并且运行速度很快。 KISS。