擅长:python、mysql、java
<p>除了分析正则表达式的潜在灾难性回溯(外部正则表达式的一个难题)或使用不允许回溯的不同正则表达式引擎之外,我认为唯一的方法是使用这种性质的超时:</p>
<pre><code>import re
import signal
class Timeout(Exception):
pass
def try_one(pat,rep,s,t=3):
def timeout_handler(signum, frame):
raise Timeout()
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(t)
try:
ret=re.sub(pat, rep, s)
except Timeout:
print('"{}" timed out after {} seconds'.format(pat,t))
return None
finally:
signal.signal(signal.SIGALRM, old_handler)
signal.alarm(0)
return ret
try_one(r'^(.+?)\1+$', r'\1' ,"a" * 1000000 + "b")
</code></pre>
<p>试图替换单个字符的大量重复(在本例中为一百万个a字符)是一个<a href="http://swtch.com/~rsc/regexp/regexp1.html" rel="nofollow">classic catastrophic regex failure</a>。它将需要数万年才能完成(至少使用Python或Perl)。Awk是不同的)。在</p>
<p>尝试3秒后,它优雅地超时并打印:</p>
^{pr2}$