regex - 使用 PowerShell 中的正则表达式过滤提高处理速度
问题描述
我有一个脚本,它使用正则表达式过滤语句搜索日志文件并将匹配的行放入另一个文件中。正则表达式相当简单,如下所示:
(en|es|fr|zh|ar|)/?(news|publications|about|key-issues|contact-us)
(还有一些匹配的关键字等)。
我很清楚哪组匹配关键字的匹配度最高。如果我将最有可能匹配的关键字放在列表中的第一位(例如,“新闻”最有可能被匹配,然后是“出版物”等),它会提高脚本的性能吗?还是顺序无关紧要?当脚本进行解析时,它是否会通过尝试与第一个元素匹配的行,然后如果不匹配第二个元素,依此类推,直到找到匹配项?如果我们知道每个关键字匹配的可能性,是否有办法使脚本更高效?
解决方案
是的,正则表达式引擎将从左到右匹配 OR,因此en
如果英语最常见,您可以通过制作最左边的 OR 来优化您的搜索。最重要的是你事先编译你的正则表达式,这样它就可以把它变成一个状态机。编译后的性能差异可能可以忽略不计(除非您已经遇到性能问题 - 请注意过早的优化)。
为了证明,请使用https://regex101.com/,然后单击“regex debugger”。何时en
是第一个,识别“en/publications”需要 22 个步骤。然而,什么时候en
是最后一个,识别相同的字符串需要 27 个步骤。
推荐阅读
- node.js - 使用带有 nodejs + redbird (node-http-proxy) 的反向代理加载 iframe 时出错
- xml - 在 GO xml 中解析具有任意结尾的元素
- unity3d - HoloToolkit Spatial Understanding Raycast Customization 可快速工作以在增强的密集顶点 3D 模型上指示注视点
- visual-studio-code - 每次更改后,VsCode / Flutter 插件都会保持“将文件同步到设备”
- reactjs - 如何确保 React 的运行版本是最新的,因为 createContext 不是函数
- javascript - Javascript函数调用和绑定
- active-directory - 如何仅从 ADAS 林中查询特定的 LDAP 域
- python - Python - 从 Pandas 输出中消除索引值
- javascript - base64-img 回调不适用于词法范围?
- sql-server - 比较 2 个不同数据库和 2 个不同服务器中的相同表