如何优化正则表达式性能?
Posted
技术标签:
【中文标题】如何优化正则表达式性能?【英文标题】:How to optimize regular expression performance? 【发布时间】:2011-05-02 06:23:55 【问题描述】:我有一个很长的正则表达式。我的正则表达式是大约 5000 个或更多短语的组合。
另外,我正在执行正则表达式的文本也很大。文本大小约为 5kb。
由于正则表达式以及输入文本很大,执行该正则表达式至少需要 2 分钟,这在我的项目中是不可接受的。
所以,我想知道如何优化它。我能想到的一种方法是拆分正则表达式并使用多个线程来最小化执行时间。这是正确的选择还是有其他方法?
我的正则表达式的一部分看起来像这样:
(ACS|ADDR.com Technologies|ADP 私人有限公司|ADP|ADP 印度私人有限公司|AIT Software Services PTE 有限公司|AMK 技术私人有限公司|ANMSoft Technologies 私人有限公司|ANZ 信息技术私人有限公司|ASD Global India 私人有限公司| ASD 印度私人有限公司|ASM Technologies 私人有限公司|AXA Group Solutions India 私人有限公司|AXA 技术印度有限公司|Aarkay Infonet 私人有限公司|AbsolutData Research and Analytics 私人有限公司|埃森哲印度私人有限公司|埃森哲服务印度|埃森哲服务有限公司|埃森哲服务私人有限公司|埃森哲|埃森哲软件私人有限公司|Accurum India 私人有限公司|AceTechnologies Inc|Aclat Inc|AcmeCeeYess Softech 私人有限公司|Adaequare India 私人有限公司|Adaequare Info 私人有限公司|Adea International 私人有限公司|Adea Technologies|Adeptra|Aditi Technologies|Adobe系统|Adroit Business Solutions|Adroit and Claretdene Infotech private limited|Affron Infotech|Agile Software Enter Prize 私人有限公司|Agilent Technologies International 私人有限公司|Akebono Soft Technologies 私人有限公司|AkebonoSoft Technologies 私人有限公司|Akmin Technologies|Algorhythm Technologies 私人有限公司|Allsec Technologies 私人有限公司|Alphonso Informex 私人有限公司|Altria 客户服务|Altruist India 私人有限公司|Amdocs| Amdocs Development Center India private limited|Amdocs Development Center India|American CyberSystems|American Express Service India private limited|美国证券交易所|Amrok Securities|Anish 信息技术私人有限公司|Ankhnet Informations 私人有限公司|Apex Technologies 私人有限公司|AppLabs|AppLabs Technologies 私人有限公司|Appshark India|Apptix Software 私人有限公司|Aquila Technologies|Arcot R and D Software 私人有限公司|Arsin Systems 私人有限公司|Ascendum Solutions 私人有限公司|AskMe Software 私人有限公司|Atos Origin 私人有限公司|Atos Origin|Atos Origin India 私人有限公司| Aurigo 软件技术s 私人有限公司|Aurona Technologies 私人有限公司|Autopower Software Solutions|Aztecsoft|BMC Software India 私人有限公司|Balasai Net 私人有限公司|Bayon Solutions 私人有限公司|Beachwood Computing Limited|Birlasoft 有限公司|Blue Bird Technologies 私人有限公司|Blue Fountain Media 私人有限公司| Blue Star InfoTech|Boden Inc|波士顿|Braahmam Net Solutions 私人有限公司|Braahmam Net Solutions 私人有限公司|Brain Soft 技术私人有限公司|Brigade Corporation 私人有限公司|Business Link Automation India 私人有限公司|BusinessLink Automation 私人有限公司|C Ahead Info Technologies India 私人有限公司|C.D.I Corporation|CCG 印度私人有限公司|CEM 解决方案|CGI 信息系统和管理顾问私人有限公司|CGI 信息系统私人有限公司|CGI 信息系统和管理顾问私人有限公司|CGI 信息和管理私人有限公司|CGI Netvorks|CISCO 系统印度私人有限公司|CMC Limited|COMSYS Inc|CORE SHELL TECHNO LOGIES|CRC Software India private limited|CRV Executive Search 私人有限公司|CS Software Solutions 私人有限公司|CSC India 私人有限公司|CSS Corp 私人有限公司|Cambridge Solutions Limited|Cambridge Solutions|Cambridge Solutions Sdn.有限公司|Candor Ind. private limited|Candor India private limited|Canvas Creatives private limited|Canvera|Capgemini Business Service India Limited|Capgemini private)
我正在使用 C# 来处理这些东西。
请赐教!!!!
【问题讨论】:
【参考方案1】:您可以通过在开头添加\b
来大大提高此正则表达式的性能:
\b(ACS| ... |Z)
这将阻止检查每个字符,而是检查每个单词。
【讨论】:
非常感谢。我会试试这个 @Shekhar - 祝你好运。次要优化包括\b(?=\w)(?: ... )
,可能分组有开销,可能值得测试。无论哪种方式,请考虑使用 Trie(字符树)并手动检查字符 - 它并不像听起来那么复杂,并且可以让您更好地控制过程。【参考方案2】:
您可以通过使用atomic grouping 或在可能的情况下使用possessive quantifiers 来优化正则表达式。
此外,如果您的正则表达式中有 .*
或 .+
之类的东西,它们可能是真正的内存/运行时消耗品,请将它们替换为(占有)character classes(如果可能,再次)。
如需更具体的答案,您需要发布您的正则表达式。
祝你好运!
【讨论】:
【参考方案3】:一种优化是提取公共前缀。改变发生,如
(This is some text|This is some other text)
到
This is some (text|other text)
这也应该在每个级别上完成。改变发生,如
ABCD|ADCB|BACD|BADC|BCAD|BCDA|BDAC|BDCA|CABD
到
A(BCD|DCB)|B(A(CD|DC)|C(AD|DA)|D(AC|CA))|CABD
这种优化是为了让 Regex 引擎不必多次测试相同的字符。
可以通过对阶段进行排序并查看连续元素来实现。注意不要在元字符处拆分。你不想在.*
或\.
中间分裂。
另一种方法是使用 Trie 结构来查找前缀。这更健壮,但更复杂一些。
【讨论】:
我也想到了 Trie。不过我不认为这很复杂。【参考方案4】:我知道它很旧,但仍然......
“OR”规则(就此而言,所有标准规则:concat、repeat 和 or)不需要手动优化。在编译大多数正则表达式引擎时会对其进行优化。有时情况正好相反 - 组太多可能会对性能产生影响,因为引擎必须保存每个组的匹配项。
真正影响性能的是向前看和向后看规则,这些规则不会在您的查询中使用。
在这种情况下,作者可以在查询的开头和结尾添加“\b”规则以要求全词搜索,这将大大限制引擎将开始匹配的位置。
【讨论】:
【参考方案5】:一个 Python 示例(在https://github.com/ksx123/regex-optimization 也有一个优化正则表达式的 C 工具):
import hachoir_regex
optimized = hachoir_regex.parse("(ACS|ADDR.com Technologies|ADP private limited|ADP|ADP India private limited|AIT Software Services PTE limited|AMK Technologies private limited|ANMSoft Technologies private limited|ANZ Information Technology private limited|ASD Global India private Limited|ASD India private Limited|ASM Technologies private limited|AXA Group Solutions India private limited|AXA technology India limited|Aarkay Infonet private limited|AbsolutData Research and Analytics private limited|Accenture India private limited|Accenture Services India|Accenture Services P Limited|Accenture Services private Limited|Accenture|Accenture Software Private Limited|Accurum India private limited|AceTechnologies Inc|Aclat Inc|AcmeCeeYess Softech Private Limited|Adaequare India private limited|Adaequare Info private limited|Adea International private limited|Adea Technologies|Adeptra|Aditi Technologies|Adobe Systems|Adroit Business Solutions|Adroit and Claretdene Infotech private limited|Affron Infotech|Agile Software Enterprise private limited|Agilent Technologies International private limited|Akebono Soft Technologies private limited|AkebonoSoft Technologies private limited|Akmin Technologies|Algorhythm Technologies private limited|Allsec Technologies private limited|Alphonso Informex private limited|Altria Client Services|Altruist India private limited|Amdocs|Amdocs Development Center India private limited|Amdocs Development Centre India|American CyberSystems|American Express Service India private limited|American Stock Exchange|Amrok Securities|Anish Information Technology private limited|Ankhnet Informations private limited|Apex Technologies private limited|AppLabs|AppLabs Technologies private limited|Appshark India|Apptix Software private limited|Aquila Technologies|Arcot R and D Software private limited|Arsin Systems private limited|Ascendum Solutions private limited|AskMe Software private limited|Atos Origin private limited|Atos Origin|Atos Origin India private limited|Aurigo Software Technologies private limited|Aurona Technologies private limited|Autopower Software Solutions|Aztecsoft|BMC Software India private limited|Balasai Net private limited|Bayon Solutions private limited|Beachwood Computing Limited|Birlasoft limited|Blue Bird Technologies private limited|Blue Fountain Media private limited|Blue Star InfoTech|Boden Inc|Boston|Braahamam Net Solutions private limited|Braahmam Net Solutions private limited|Brain Soft technology private limited|Brigade Corporation Private Limited|Business Link Automation India private limited|BusinessLink Automation private limited|C Ahead Info Technologies India private limited|C.D.I Corporation|CCG India private limited|CEM Solutions|CGI Information Systems and Management Consultants private limited|CGI Information Systems private limited|CGI Information System and Management Consultants private limited|CGI Information and Management private limited|CGI Netvorks|CISCO Systems India private limited|CMC Limited|COMSYS Inc|CORE SHELL TECHNOLOGIES|CRC Software India private limited|CRV Executive Search private limited|CS Software Solutions private Limited|CSC India private Limited|CSS Corp private limited|Cambridge Solutions Limited|Cambridge Solutions|Cambridge Solutions Sdn. Bhd|Candor Ind. private limited|Candor India private limited|Canvas Creatives private limited|Canvera|Capgemini Business Service India Limited|Capgemini private)")
len(str(optimized)) # has length 3048
虽然原始字符串的长度为3399
。字符串越大,可能的优化就越多。这使用the hachoir-regex
library。除了按照建议添加\b
之外,您还可以使用它。
【讨论】:
以上是关于如何优化正则表达式性能?的主要内容,如果未能解决你的问题,请参考以下文章