2009-05-05 10 views
1

ich folgendes Problem mit und fragte, ob jemand sehen konnte, warum dies meine .net-Arbeitsprozess (aspnet_wp.exe) Absturz:.Net Regular Expression Crashes aspnet_wp.exe

Dim pattern As String = "\{\{IF\(((?!\)}})(.))+,,,((\s)*(?!\)}})(.))+\)}}" 
    Dim mc As RegularExpressions.MatchCollection = Regex.Matches(txtContent.Text, pattern) 

Works absolut in Ordnung, wenn eine Übereinstimmung gefunden wird, zB

<h3>Title</h3> 
<p>Top paragraph.</p> 

{{IF(1=2,,, <p></p>)}} 

Aber wenn keine Übereinstimmung gefunden wird es scheint, meine CPU und läuft schon eine ganze Weile nageln, zB wenn die letzte Klammer vor den letzten beiden geschweiften brakcets fehlt:

<h3>Title</h3> 
<p>Top paragraph.</p> 

{{IF(1=2,,, <p></p>}} 

Ist es zu gierig, dass es für immer sucht !? Vielen Dank!

Antwort

3

Das Problem ist leicht identifiziert: "Catastrophic Backtracking".

Jedes Mal, wenn Sie das "Wenn eine Übereinstimmung existiert, es funktioniert, wenn keine Übereinstimmung existiert, es dauert ewig" Phänomen, können Sie sicher sein, dass das die Ursache ist.

Ich schlage eine andere Regex, die weniger Backtracking tut. Atomic grouping kann helfen, bei einem Minimum Rückzieher Schritte halten:

Dim pattern As String = "\{\{IF\((?>(?:(?!,,,).)+),,,(?>(?:(?!\)\}\}).)+)\}\}" 
Dim mc As RegularExpressions.MatchCollection = Regex.Matches(txtContent.Text, pattern) 

Das Muster (weiß nicht, ob ich alles erfassen Sie brauchen - Klammern hinzuzufügen, wo Sie sehen, passen):

\{\{IF\(    # "{{IF(" 
(?>(?:(?!,,,).)+)  # atomic group: any char up to the ",,," 
,,,      # ",,," 
(?>(?:(?!\)\}\}).)+) # atomic group: any char up to the ")}}" 
\)\}\}     # ")}}" 
+0

+1, großer Artikel – JaredPar

+0

Danke Tomalak, ich lese jetzt durch! – stibstibstib