2012-11-11 13 views
7

Sto cercando un'espressione regolare per trovare gruppi di acquisizione denominati in stringhe di regex (altre).Regex per trovare gruppi di acquisizione denominati con il linguaggio di programmazione Go

Esempio: Voglio trovare (?P<country>m((a|b).+)n), (?P<city>.+) e (?P<street>(5|6)\. .+) nel seguente espressione regolare:

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

ho provato la seguente espressione regolare per trovare i gruppi di cattura denominati:

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 rende quantificatori greedy (+ e *) quantificatori non avidi e non grezzi (*?) avidi. Dettagli nello Go regex documentation.

Ma non funziona perché le parentesi non corrispondono correttamente.

risposta

6

La corrispondenza di parentesi nidificate arbitrariamente correttamente non è possibile con le espressioni regolari poiché l'annidamento arbitrario (ricorsivo) non può essere descritto da una lingua normale.

Alcuni moderno sapore regex supportano la ricorsione (Perl, PCRE) o corrispondenza bilanciati (NET), ma Go non è uno di loro (the docs explicitly say che (?R) costrutto di Perl non è supportata dal RE2 library that Go's regex package appears to be based on). È necessario creare un parser di discesa ricorsivo, non una regex.

+2

Giusto per chiarire: il pacchetto Go "regexp" _non utilizza la libreria RE2. – zzzz

+1

Lo fa - basta seguire il link – mvp

+0

OK, in realtà non usa quella libreria, ma accetta la stessa sintassi. –

Problemi correlati