2015-05-18 12 views
8

Dal momento che sono un po 'nuova con re2, sto cercando di capire come utilizzare positiva lookahead (?=regex) come JS, C++ o qualsiasi stile PCRE in Go.Utilizzando positiva lookahead (? = Regex) con RE2

Ecco alcuni esempi di ciò che sto cercando.

JS:

'foo bar baz'.match(/^[\s\S]+?(?=baz|$)/); 

Python:

re.match('^[\s\S]+?(?=baz|$)', 'foo bar baz') 
  • Nota: entrambi gli esempi corrispondono 'foo bar '

Grazie mille.

+5

Guardando https://github.com/google/re2/wiki/Syntax - c'è una linea che dice "' 'prima di confronto tra parole' re' (non supportato) (= ri?)". Questo non sembra buono. Inoltre, si dice "alternativa ai motori di espressione regolare di backtracking" - suggerendo che eliminerebbero alcune funzionalità. – Kobi

+0

Immagino che sia una sorta di risposta, quindi ne ho aggiunto uno. – Kobi

+1

@Kobi c'è ora [dlclark/regexp2] (https://github.com/dlclark/regexp2) disponibile – Andy

risposta

5

È possibile raggiungere questo obiettivo con un'espressione regolare più semplice:

re := regexp.MustCompile(`^(.+?)(?:baz)?$`) 
sm := re.FindStringSubmatch("foo bar baz") 
fmt.Printf("%q\n", sm) 

sm[1] sarà la vostra partita. Parco giochi: http://play.golang.org/p/Vyah7cfBlH

+0

Sì, catturare il gruppo è l'unico modo per raggiungerlo ... almeno, fino a quando non vengono implementate le previsioni in Go, –

+0

Sì, sto usando anche questa soluzione. thx – a8m

+4

@stribizhev (wrt il tuo commento "fino a quando non sono stati implementati in Go"), dubito che tali funzionalità saranno mai aggiunte a Go o che Go passerà dall'uso di RE2. (Anche se probabilmente potresti usare un pacchetto PCRE di terze parti, non lo consiglierei). La maggior parte/tutte queste "caratteristiche" non sono supportate a causa del design di base che è una scelta deliberata tra funzionalità "avanzate" (ma lente/pericolose) e velocità e sicurezza (in termini di tempo di esecuzione/memoria). Vedere https://swtch.com/~rsc/regexp/regexp1.html per i dettagli (o semplicemente guardare i grafici). –

11

Secondo il Syntax Documentation, questa funzione non è supportata:

(?=re) prima il testo corrispondente re (non supportato)

Inoltre, da WhyRE2:

In linea di principio, RE2 non supporta i costrutti per cui solo le soluzioni di backtracing sono e noto per esistere. Pertanto, le sottostazioni e le asserzioni di ricerca non sono supportate.

+0

Dovrei dare a Wiki più attenzione :). grazie. – a8m