我遇到了以下问题,并想知道是否有人能够看到为什么这会导致我的.net工作进程崩溃(aspnet_wp.exe):
Dim pattern As String = "\{\{IF\(((?!\)}})(.))+,,,((\s)*(?!\)}})(.))+\)}}"
Dim mc As RegularExpressions.MatchCollection = Regex.Matches(txtContent.Text, pattern)
如果找到匹配项,则绝对正常,例如
<h3>Title</h3>
<p>Top paragraph.</p>
{{IF(1=2,,, <p></p>)}}
但是如果没有找到匹配,那么它似乎会锁定我的cpu并运行很长一段时间,例如如果在最后两个卷曲brakcets之前丢失了最后一个括号:
<h3>Title</h3>
<p>Top paragraph.</p>
{{IF(1=2,,, <p></p>}}
它是否太贪婪,它永远搜索!?谢谢!
答案 0 :(得分:3)
问题很容易识别:"Catastrophic Backtracking"。
每当你看到“如果匹配存在,它就有效,如果不存在匹配,则需要永远”现象,你可以确定这是原因。
我建议使用不同的正则表达式来减少回溯。 Atomic grouping可以帮助保持最低限度的回溯步骤:
Dim pattern As String = "\{\{IF\((?>(?:(?!,,,).)+),,,(?>(?:(?!\)\}\}).)+)\}\}"
Dim mc As RegularExpressions.MatchCollection = Regex.Matches(txtContent.Text, pattern)
模式(不知道我是否捕获了你需要的一切 - 在你认为合适的地方添加括号):
\{\{IF\( # "{{IF("
(?>(?:(?!,,,).)+) # atomic group: any char up to the ",,,"
,,, # ",,,"
(?>(?:(?!\)\}\}).)+) # atomic group: any char up to the ")}}"
\)\}\} # ")}}"