2009-05-05 67 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