.Net Regular Expression崩溃aspnet_wp.exe

时间:2009-05-05 12:22:52

标签: .net regex

我遇到了以下问题,并想知道是否有人能够看到为什么这会导致我的.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>}}

它是否太贪婪,它永远搜索!?谢谢!

1 个答案:

答案 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 ")}}"
\)\}\}                  # ")}}"