如何优化正则表达式性能?

时间:2011-05-02 06:23:55

标签: c# regex performance c#-2.0

我有一个很长的正则表达式。我的正则表达式是大约5000或更多短语的组合。

此外,我正在执行正则表达式的文本也很庞大。文字大小约为5kb。

因为正则表达式和输入文本都是巨大的,所以执行正则表达式至少需要2分钟,这在我的项目中是不可接受的。

所以,我想知道如何优化这一点。我能想到的一种方法是拆分正则表达式并使用多个线程来最小化执行时间。这是正确的选择还是有其他方式吗?

我的部分正则表达式如下:

  

(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印度私人有限公司| ASM Technologies私人有限公司| AXA集团解决方案印度私人有限公司| AXA技术印度有限公司| Aarkay Infonet私人有限公司| AbsolutData研究和分析私人有限公司|埃森哲印度私人有限公司|埃森哲服务印度|埃森哲服务有限公司|埃森哲服务私人有限公司|埃森哲|埃森哲软件私人有限公司| Accurum印度私人有限公司| AceTechnologies公司| Aclat公司| AcmeCeeYess Softech私人有限公司| Adaequare印度私人有限公司| Adaequare信息私人有限公司|阿达国际私人有限公司| Adea Technologies | Adeptra | Aditi Technologies | Adob​​e Systems | Adroit Business Solutions | Adroit和Claretdene Infotech private limited | Affron Infotech | Agile Software Enter奖私人有限公司|安捷伦科技国际私人有限公司| Akebono Soft Technologies私人有限公司| AkebonoSoft Technologies私人有限公司| Akmin Technologies | Algorhythm Technologies私人有限公司| Allsec Technologies私人有限公司| Alphonso Informex私人有限公司| Altria客户服务| Altruist India私人有限公司| Amdocs | Amdocs开发中心印度私人有限公司| Amdocs开发中心印度|美国Cyber​​Systems |美国运通服务印度私人有限公司|美国证券交易所| Amrok证券| Anish信息技术私人有限公司| Ankhnet Informations private limited | Apex Technologies private limited | AppLabs | AppLabs Technologies有限公司| Appshark印度| Apptix软件私人有限公司| Aquila Technologies | Arcot R和D软件私人有限公司| Arsin Systems私人有限公司| Ascendum Solutions私人有限公司| AskMe Software私人有限公司| Atos Origin私人有限公司| Atos Origin | Atos Origin India私人有限公司| Aurigo Software Technologie s私人有限公司| Aurona Technologies私人有限公司| Autopower软件解决方案| Aztecsoft | BMC Software India私人有限公司| Balasai Net私人有限公司| Bayon Solutions私人有限公司| Beachwood Computing Limited | Birlasoft有限公司| Blue Bird Technologies私人有限公司| Blue Fountain Media私人有限公司| Blue Star InfoTech | Boden Inc |波士顿| Braahamam Net Solutions私人有限公司| Braahmam Net Solutions私人有限公司| Brain Soft技术私人有限公司| Brigade Corporation Private Limited | Business Link Automation印度私人有限公司| BusinessLink Automation私人有限公司| C Ahead Info Technologies印度私营有限公司| CDI Corporation | CCG India private limited | CEM Solutions | CGI信息系统和管理顾问私人有限公司| CGI信息系统私人有限公司| CGI信息系统和管理顾问私人有限公司| CGI信息和管理私人有限公司| CGI Netvorks |思科系统印度私人有限公司| CMC Limited | COMSYS Inc | CORE SHELL TECHNO LOGIES | CRC Software India private limited | CRV Executive Search private Limited | CS Software Solutions private Limited | CSC India private Limited | CSS Corp私人有限公司| Cambridge Solutions Limited |剑桥解决方案| Cambridge Solutions Sdn.Bhd。有限公司| Candor Ind。私人有限公司| Candor India私人有限公司| Canvas Creatives私人有限公司| Canvera | Capgemini Business Service India Limited | Capgemini private)

我正在使用C#。

请指教!!!!

5 个答案:

答案 0 :(得分:8)

您可以通过在开头添加\b来大大提高此正则表达式的性能:

\b(ACS| ... |Z)

这样可以防止检查每个字符,并检查每个字。

答案 1 :(得分:7)

您可以使用atomic grouping或尽可能使用possessive quantifiers优化正则表达式。

此外,如果你的正则表达式中有.*.+之类的东西,可能是真正的内存/运行时生猪,请用(占有)character classes替换它们(如果可能的话,再次)。

要获得更具体的答案,您需要发布正则表达式。

祝你好运!

答案 2 :(得分:7)

一个优化是提取公共前缀。改变发生的事件,如

(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结构来查找前缀。这更加强大,但有点复杂。

答案 3 :(得分:2)

我知道它已经老了,但仍然......

" OR"规则(对于这个问题,所有标准规则:concat,repeat和or)不需要手动优化。编译大多数正则表达式引擎时会优化它。有时它恰恰相反 - 太多的群体可能会对性能产生影响,因为引擎必须保存每个群组的匹配。

真正难以取得成功的是展望未来并查看规则背后的规则,而这些规则并未在您的查询中使用。

在这种情况下,作者可以添加' \ b'在查询的开头和结尾处规则要求全字搜索,这将显着限制引擎开始匹配的位置。

答案 4 :(得分:0)

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之外,您还可以使用此功能。