2009-05-05 7 views
1

Je vais avoir le problème suivant et je me demandais si quelqu'un pouvait voir pourquoi cela se bloque mon processus de travail .net (aspnet_wp.exe):.Net Regular Expression Crashes aspnet_wp.exe

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

Works absolument bien si une correspondance est trouvée, par exemple

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

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

Mais si aucune correspondance est trouvée, il semble clouer mon cpu et courir pendant un certain temps, par exemple, si le dernier support est manquant avant que les deux derniers brakcets bouclés:

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

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

Est-ce trop gourmand qu'il cherche pour toujours? Merci!

Répondre

3

Le problème est facilement identifié: "Catastrophic Backtracking".

Chaque fois que vous voyez le "si une correspondance existe, cela fonctionne, si aucune correspondance n'existe, cela prend une éternité" phénomène, vous pouvez être sûr que c'est la cause.

Je suggère une regex différente qui fait moins de backtracking. Atomic grouping peut aider à maintenir les étapes de traçage au minimum:

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

Le motif (ne sais pas si je capture tout ce dont vous avez besoin - ajouter entre parenthèses où bon vous semble):

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

+1, grand article – JaredPar

+0

Merci Tomalak, je vais lire maintenant! – stibstibstib

Questions connexes