【问题标题】:Optimize regex for maximum speed优化正则表达式以获得最大速度
【发布时间】:2013-10-26 15:38:56
【问题描述】:

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

第一个应该匹配例如

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)/.* 

编辑:这些正则表达式用于squid configuration

【问题讨论】:

  • 这将是代码审查的东西。
  • 您使用哪种语言/工具?在您的问题中提及它!有人可以提供一个好的非正则表达式解决方案!
  • 由于 Omid Kosari 可能知道也可能不知道,Games Brainiac 谈到了 code-review
  • (.+\.||) 可以简化为 (.+\.)? 并且可能没有必要。在每个表达式中添加 EOL 锚点 $ 可能会有所帮助。此外,为简洁起见,将所有元点转换为文字,即:转换为 nai\.com
  • 你说得对,我不知道 Code Review 。谢谢

标签: regex performance optimization cpu-usage


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。很有用 。我希望其他人提供更多答案,否则您的答案将被接受。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,但它不是编程语言。它在 squid 配置文件中。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2021-02-19
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多