2013-08-06 17 views
5

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"?

+1

Musisz dowiedzieć się o '?' I jego znaczeniu w Regex. Poprawka: 'if \ b \ s \ [. * \] \ S \ {(\ s |.) *? \}' –

+0

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ć. –

+0

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) –

Odpowiedz

0

Korzystanie z "?" jako kwalifikator czyni "*" nie-chciwym. W rzeczywistości może być lepiej użyć "+":

\[.+?]

Jako @ It'sNotALie powiedział (parafrazując), należy skorzystać z odrobiną wyjaśnień:

A sample of a nice tutorial

2

Wystąpił podobny problem, gdy próbowałem wykryć ciągi znaków SQL (z możliwością wystąpienia cytatów z apostrofami), spróbuj wyrażenie: if.*?\{(\{.*?\}|[^}])*+\}

Będzie pasować do if, a następnie condition aż do pierwszego {, to od tej pory będzie to kontynuować dopasowanie jeśli napotka albo coś między{ i }LUB wszystkiego, co nie jest }, a następnie ostatecznym zamknięciem }.

Użyłem kwantyfikatora dzierżawczego, aby zapobiec możliwości katastroficznego cofnięcia.

Powiązane problemy