2013-08-06 22 views
5

Nell'implementare un parser di script di piccole dimensioni ho riscontrato un problema con questo esempio di codice: volendo selezionare solo la parte compresa tra le istruzioni "if {}", è essere avidi e selezionare tutto incluso l'ultima riga. Immagino che cosa dovrei usare è un aspetto negativo.C# RegEx che impedisce la corrispondenza avida con lo stesso modello ripetuto

if [condition1] 
{ 
    task1 
    setparameters{a} 
    task2 
} 

if [condition2] 
{ 
    task3 
} 

setparameters{b} 

Attualmente, ho:

if\b\s\[.*\]\s\{(\s|.)*\} 

Credo che non è così semplice come la rottura di un altro 'se' o, come qualcosa di diverso può venire prima di allora. È possibile contare un numero uguale di parentesi graffe di apertura e chiusura? O c'è un altro modo magico in cui posso semplicemente selezionare una di queste affermazioni "se"?

+1

È necessario conoscere "?" E il suo significato in Regex. Una correzione: 'if \ b \ s \ [. * \] \ S \ {(\ s |.) *? \}' –

+0

Forse avrei dovuto aggiungere un po 'più di qualifiche sul motivo per cui non avrei fatto il * non-goloso - c'è la possibilità che una parentesi di chiusura} possa apparire all'interno del ciclo. Ho aggiornato l'originale per mostrarlo. –

+0

Ah, quindi inizi a guardare i gruppi di bilanciamento. Non sapevo cosa fossero, quindi ho postato una domanda. La risposta è meravigliosa. Leggi: [Cosa sono i gruppi di bilanciamento delle espressioni regolari?] (Http://stackoverflow.com/questions/17003799/What-are-regular-expression-balancing-groups) –

risposta

0

Utilizzo di un "?" come un qualificatore rende un "*" non-goloso. In effetti, potrebbe essere meglio usare "+":

\[.+?]

Come @ It'sNotALie detto (parafrasato), si potrebbe beneficiare di un po 'di spiegazione:

A sample of a nice tutorial

2

mi sono imbattuto in un problema simile quando ho cercato di individuare stringhe SQL (con la possibilità di citazioni evasi), provare il regex: if.*?\{(\{.*?\}|[^}])*+\}

Si abbinerà un if seguito dal condition fino alla prima {, poi da quel momento in poi continuerà corrispondenza se incontra o qualcosa tra un { e }OR tutto ciò che non è un }, seguita dalla chiusura finale }.

Ho utilizzato il quantificatore possessivo per impedire la possibilità di un backtracking catastrofico.