首页 > 解决方案 > 使用 PowerShell 中的正则表达式过滤提高处理速度

问题描述

我有一个脚本,它使用正则表达式过滤语句搜索日志文件并将匹配的行放入另一个文件中。正则表达式相当简单,如下所示:

(en|es|fr|zh|ar|)/?(news|publications|about|key-issues|contact-us)

(还有一些匹配的关键字等)。

我很清楚哪组匹配关键字的匹配度最高。如果我将最有可能匹配的关键字放在列表中的第一位(例如,“新闻”最有可能被匹配,然后是“出版物”等),它会提高脚本的性能吗?还是顺序无关紧要?当脚本进行解析时,它是否会通过尝试与第一个元素匹配的行,然后如果不匹配第二个元素,依此类推,直到找到匹配项?如果我们知道每个关键字匹配的可能性,是否有办法使脚本更高效?

标签: regexperformance

解决方案


是的,正则表达式引擎将从左到右匹配 OR,因此en如果英语最常见,您可以通过制作最左边的 OR 来优化您的搜索。最重要的是你事先编译你的正则表达式,这样它就可以把它变成一个状态机。编译后的性能差异可能可以忽略不计(除非您已经遇到性能问题 - 请注意过早的优化)。

为了证明,请使用https://regex101.com/,然后单击“regex debugger”。何时en是第一个,识别“en/publications”需要 22 个步骤。然而,什么时候en是最后一个,识别相同的字符串需要 27 个步骤。


推荐阅读