2014-11-06 12 views
10

Sto cercando di utilizzare aheads sguardo negativi in ​​Go:sguardo Negativo AVANTI espressioni regolari

La seguente espressione regolare: BBB(((?!BBB).)*)EEE

http://rubular.com/r/Zw1vopp1MF

Tuttavia in Go ottengo:

error parsing regexp: invalid or unsupported Perl syntax: `(?!` 

Ci sono alternative?

+0

Qual è il tuo output previsto che desideri? – hwnd

+0

Voglio abbinare tutto tra un BBB e EEE. Tuttavia, se c'è un'istanza con BBB qualcosa BBB qualcos'altro EEE. Voglio solo abbinare "BBB qualcos'altro EEE" – K2xL

+0

L'unica cosa che puoi fare è http://regex101.com/r/aM5oU3/4 se sei molto sicuro che il 'B' o' BB' standalone non ci sia nel stringa. – vks

risposta

3

In base agli esempi e all'output atteso, funzionerà quanto segue.

re := regexp.MustCompile(`BBB([^B]*)EEE`) 

GoPlay

+1

Sembra che questo potrebbe fallire per qualcosa di simile: 'BBB xx B xx EEE' – femtoRgon

+1

Potrebbe essere una soluzione, ma a una domanda diversa. La domanda riguardava il lookahead negativo. –

+1

Sì, che non è supportato. – hwnd

10

lookahead negativo non è supportato per motivi tecnici, in particolare perché è in conflitto con la O (n) -time garanzie della biblioteca. Vedere lo golang-nuts group discussion a proposito di questo, oltre alla sezione Avvertenze in Regular Expression Matching in the Wild.

è possibile esprimere l'espressione regolare che hai descritto senza lookahead negativo:

BBB([^B]|B[^B]|BB[^B])*EEE 

Ecco un example per dimostrare:

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    re := regexp.MustCompile(`BBB([^B]|B[^B]|BB[^B])*EEE`) 
    fmt.Printf("%#v\n", re.FindAllString("BBB EEE BBB..BBB...EEE", -1)) 
} 
+0

La soluzione di @ hwnd è più semplice. Suppongo che quando pronunci 'BBB', non intendi letteralmente' BBB' letteralmente, ma piuttosto una sequenza arbitraria di caratteri Beginning, seguita da una sequenza di caratteri Ending. Ma forse stai cercando '" BBB "' e '" EEE "'. : P – dyoo

0

dlclark/regexp2 è un porto di motore del .NET framework System.Text.RegularExpressions.Regex.

Ci sono alcune differenze fondamentali tra stringhe .NET e stringhe di Go che richiedevano anche un po 'di prestito dal motore regex di Go framework. Ho ripulito un paio di bit più sporchi durante la porta (regexcharclass.cs era terribile), ma l'albero di analisi, il codice emmitted e quindi i pattern abbinati dovrebbero essere identici.

il nome di E 'sceso alla fine del lengthy discussion about O(n) regular expressions, ed è caveated:

Tuttavia, vorrei consigliare cautela, in quanto ci sono benefici per il motore RE2-based che non sono forniti da più piena funzionalità motori con lookaround. Se hai l'opzione, segui lo stdlib.

Il costo delle funzionalità è un'implementazione più lenta.