2009-05-05 42 views
1

我有以下问题,并想知道是否有人能看到这是为什么我崩溃.NET辅助进程(Aspnet_wp.exe):净正则表达式崩溃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>}} 

它过于贪婪,它永远搜索!?谢谢!

回答

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 ")}}" 
\)\}\}     # ")}}" 
+0

+1,大文章 – JaredPar 2009-05-05 12:59:27