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