Przy wdrażaniu małego parsera skryptu natknąłem się na problem z tą próbką kodu - chcąc wybrać tylko część między i włączając instrukcje "if {}", bycie chciwym i wybieranie wszystkich, łącznie z ostatnią linią. Sądzę, że to, co powinienem użyć, to negatywny uprzedzający.C# RegEx zapobieganie zachłannemu dopasowaniu z tym samym wzorcem powtórzonym
if [condition1]
{
task1
setparameters{a}
task2
}
if [condition2]
{
task3
}
setparameters{b}
Obecnie mam:
if\b\s\[.*\]\s\{(\s|.)*\}
Chyba to nie jest tak proste, jak łamanie na innym „if” albo, jako coś innego może przyjść wcześniej. Czy możliwe jest policzenie równej liczby nawiasów otwierających i zamykających? Czy istnieje inny magiczny sposób, w jaki mogę wybrać jedną z tych instrukcji "if"?
Musisz dowiedzieć się o '?' I jego znaczeniu w Regex. Poprawka: 'if \ b \ s \ [. * \] \ S \ {(\ s |.) *? \}' –
Być może powinienem był dodać trochę więcej informacji, dlaczego nie zrobiłem * non-chciwy - jest szansa, że klamra zamykająca} może pojawić się w pętli. Zaktualizowałem oryginał, aby to pokazać. –
Ah, wtedy zaczynasz patrzeć na grupy balansujące. Nie wiedziałem, co to jest, więc napisałem pytanie. Odpowiedź jest cudowna. Przeczytaj: [Czym są grupy wyrównywania wyrażeń regularnych?] (Http://stackoverflow.com/questions/17003799/What-are-regular-expression-balancing-groups) –