首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化正则表达式的性能?

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

Stack Overflow用户
提问于 2011-05-02 06:23:55
回答 5查看 4.1K关注 0票数 7

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

而且,我正在执行regex的文本也是巨大的。文本大小约为5kb。

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

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

我的部分regex看起来如下:

(ACS|ADDR.com技术有限公司ADP私人ADP印度私人有限公司ADP ADP私人软件服务有限公司Accenture印度私人有限公司Accenture印度私人服务有限公司Accenture印度私人有限公司Accenture Software私人有限公司Accenture Software私人有限公司Accenture Software private limited Accenture Software limited Accenture Software private limited Accenture Services有限公司Accenture Software private limited Accenture Services有限公司Accenture Services有限公司Accenture Software private limited Accenture Software private limited Aclat.Aclat.AcmeCeeYess Softech私人技术有限公司)印度私人有限公司美国运通服务印度私人有限公司美国运通服务印度私人有限公司美国运通服务印度私人有限公司美国证券交易所Amrok证券私人有限公司Anish信息私人有限公司Apex技术私人有限公司AppLabs AppLabs私人有限公司App鲨印度有限公司Apptix软件有限公司私营公司Aquila技术有限公司Arcot技术公司Arcot技术有限公司私人有限公司Arsin系统有限公司私营公司AskMe软件有限公司AskMe私人有限公司Atos起步有限公司Atos起源印度私人有限公司Aurigo软件技术有限公司Aurona私人公司私营公司Aurona私人软件有限公司私人有限公司C.D.I公司印度私人有限公司CCG私人有限公司CEM解决方案CGI信息系统和管理顾问私人有限公司CGI信息系统私人有限公司CGI信息系统和管理顾问私人有限公司CGI信息和管理私人有限公司CGI Netvorks印度私人有限公司CMC有限公司印度有限公司核心壳技术有限公司CRV有限公司私人搜索私人有限公司CS软件解决方案私人有限公司CSC印度私人有限公司CSC印度私人有限公司CSC私人有限公司剑桥解决方案坎布里奇解决方案有限公司剑桥解决方案坦率的印地安。私人有限公司印度私人有限公司帆布创意私人有限公司坎韦拉凯捷商业服务印度有限公司

我正在使用C#来实现这个功能。

请开导!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-02 07:09:47

通过在开始时预先预置\b,您可以大大提高这个正则表达式的性能:

代码语言:javascript
复制
\b(ACS| ... |Z)

这将防止对每个字符进行检查,而是检查每个单词。

票数 8
EN

Stack Overflow用户

发布于 2011-05-02 06:28:46

您可以通过使用原子分组或在可能的情况下使用占有量词优化正则表达式。

另外,如果您的regex中有.*.+之类的东西,这可能是真正的内存/运行时占用,请用(拥有) 字符类 (如果可能的话)替换它们。

为了得到更具体的答案,你需要发布你的regex。

祝好运!

票数 8
EN

Stack Overflow用户

发布于 2011-05-02 06:34:54

一种优化方法是提取通用前缀。发生变化,如

代码语言:javascript
复制
(This is some text|This is some other text)

代码语言:javascript
复制
This is some (text|other text)

这也应该在每一个层次上进行。发生变化,如

代码语言:javascript
复制
ABCD|ADCB|BACD|BADC|BCAD|BCDA|BDAC|BDCA|CABD

代码语言:javascript
复制
A(BCD|DCB)|B(A(CD|DC)|C(AD|DA)|D(AC|CA))|CABD

这个优化使得Regex引擎不必对相同的字符进行多次测试。

它可以通过对阶段进行排序,并查看连续的元素来实现。注意不要在元字符上分裂.您不想在.*\.中间分裂。

另一种方法是使用Trie-结构来查找前缀。这是更强大,但更复杂一些。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5854063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档