我有一个很长的正则表达式。我的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#来实现这个功能。
请开导!
发布于 2011-05-02 07:09:47
通过在开始时预先预置\b,您可以大大提高这个正则表达式的性能:
\b(ACS| ... |Z)这将防止对每个字符进行检查,而是检查每个单词。
发布于 2011-05-02 06:28:46
您可以通过使用原子分组或在可能的情况下使用占有量词优化正则表达式。
另外,如果您的regex中有.*或.+之类的东西,这可能是真正的内存/运行时占用,请用(拥有) 字符类 (如果可能的话)替换它们。
为了得到更具体的答案,你需要发布你的regex。
祝好运!
发布于 2011-05-02 06:34:54
一种优化方法是提取通用前缀。发生变化,如
(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-结构来查找前缀。这是更强大,但更复杂一些。
https://stackoverflow.com/questions/5854063
复制相似问题