2012-11-11 14 views
7

Poszukuję wyrażeń regularnych, aby znaleźć nazwane grupy przechwytujące w (innych) ciągach regex.Regex, aby znaleźć nazwane grupy przechwytujące z językiem programowania Go

Przykład: Chcę znaleźć (?P<country>m((a|b).+)n), (?P<city>.+) i (?P<street>(5|6)\. .+) w następującym regex:

/(?P<country>m((a|b).+)n)/(?P<city>.+)/(?P<street>(5|6)\. .+) 

Próbowałem następujące regex znaleźć nazwanych grup przechwytywania:

var subGroups string = `(\(.+\))*?` 
var prefixedSubGroups string = `.+` + subGroups 
var postfixedSubGroups string = subGroups + `.+` 
var surroundedSubGroups string = `.+` + subGroups + `.+` 
var capturingGroupNameRegex *regexp.RichRegexp = regexp.MustCompile(
    `(?U)` + 
    `\(\?P<.+>` + 
    `(` + prefixedSubGroups + `|` + postfixedSubGroups + `|` + surroundedSubGroups + `)` + 
    `\)`) 

?U sprawia chciwych kwantyfikatorów (+ i *) chciwych kwantyfikatorów bez chciwości i nie chciwych (*?) chciwych. Szczegóły w Go regex documentation.

Ale to nie działa, ponieważ nawiasy nie są poprawnie dopasowane.

Odpowiedz

6

Prawidłowe nawiasy zagnieżdżone poprawnie są niemożliwe w przypadku wyrażeń regularnych, ponieważ arbitralne (rekurencyjne) zagnieżdżanie nie może być opisane za pomocą zwykłego języka.

Niektóre nowoczesne smak regex zrobić rekursji support (Perl, PCRE) lub zrównoważone dopasowanie (.NET), ale Go nie jest jednym z nich (the docs explicitly say że Perl (?R) konstrukcja nie jest obsługiwany przez RE2 library that Go's regex package appears to be based on). Musisz zbudować parser rekurencyjny, a nie regex.

+2

Aby wyjaśnić: pakiet Go "regexp" _nie używaj_ biblioteki RE2. – zzzz

+1

To działa - po prostu podążaj za odnośnikiem – mvp

+0

OK, to w rzeczywistości nie korzysta z tej biblioteki, ale akceptuje tę samą składnię. –

Powiązane problemy