1

请帮助我优化以下正则表达式以获得最佳性能。我读过一些文章,但这个问题应该很快解决,以减少 cpu 使用和延迟时间,所以我没有足够的时间尝试和 false。

例如,第一个应该匹配

http://microsoft.com/test/temp.iso

http://download.microsoft.com/TEMP.iso

注意

  • 所有的网址都应该以开头,http:// 所以我不知道先放好^http://还是不放好?

  • 第一行和最后一行有特定的规则,但它们之间的行可以合并。

任何帮助表示赞赏。

refresh_pattern -i (.+\.||)(microsoft|windowsupdate).com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|iso|psf) 
refresh_pattern -i (.+\.||)eset.com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|ver|nup) 
refresh_pattern -i (.+\.||)avg.com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|ctf|bin|gz) 
refresh_pattern -i (.+\.||)grisoft.(com|cz)/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|ctf|bin|gz) 
refresh_pattern -i (.+\.||)avast.com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|vpx|vpu|vpa|vpaa|def|stamp) 
refresh_pattern -i (.+\.||)(kaspersky-labs|kaspersky).com/.*\.(cab|zip|exe|msi|msp|bz2|avc|kdc|klz|dif|dat|kdz|kdl|kfb) 
refresh_pattern -i (.+\.||)nai.com/.*\.(gem|zip|mcs|tar|exe|) 
refresh_pattern -i (.+\.||)adobe.com/.*\.(cab|aup|exe|msi|upd|msp) 
refresh_pattern -i (.+\.||)symantecliveupdate.com/.*\.(zip|exe|msi) 
refresh_pattern -i (.+\.||)(192\.168\.10\.34|mywebsite.com)/.* 

编辑:这些正则表达式用于鱿鱼配置

4

2 回答 2

4

一些优化正则表达式的技巧:

首先,使用.*可能会导致性能问题,具体取决于您要匹配的字符串的大小以及您的匹配通常多早在字符串中结束。试试看.*?是否有帮助。如果您了解更多有关.将匹配的性质的详细信息,则可能会找到更快的替代品。

其次,如果您的正则表达式引擎支持它,并且您实际上不需要从匹配中提取捕获组,则可以将它们设为非捕获。这提供了一个小而一致的性能提升。在 Ruby 中,非捕获组看起来像:(?:PUT CONTENTS HERE).

一点建议:你说你想“快速解决这个问题”,但“没有时间”试错。很抱歉,但如果您想要获得最佳性能,您将不得不进行自己的基准测试,并在您的语言和数据集中找到最快的。像我这样的人所能做的就是在你对替代解决方案进行基准测试时给你一些建议,告诉你应该尝试什么。

于 2013-10-26T16:01:58.033 回答
0

根据编程语言,您可以在程序启动时编译此正则表达式,然后重用正则表达式对象。在 C# 中,它看起来像这样:

Regex regex = new Regex(pattern, RegexOptions.Compiled);

编译正则表达式需要更多时间,但如果你使用它几次,它是值得的。

于 2013-10-26T15:47:46.937 回答