Negatives Matching in Go Regex
In Go Regexp kann es schwierig sein, alles außer einer bestimmten Konstantenzeichenfolge abzugleichen, da es keine Lookaround-Konstrukte gibt .
Original RegExp:
Der bereitgestellte reguläre Ausdruck, /.*/.*/(.*), entspricht allem nach drei Backslashes. Es schließt jedoch Zeichenfolgen nicht aus, die „somestring“ enthalten.
Negationsansätze
Methode 1: Webdienst
Eins Die Problemumgehung besteht darin, einen Webdienst zu verwenden, der POSIX-kompatible negierte Muster generiert. Für „somestring“ wird dadurch ein komplexes Muster generiert, das in den ursprünglichen RegExp eingesetzt werden kann:
/[^/]*/[^/]*/^([^s]|s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*([^os]|o([^ms]|m([^es]|e([^s]|s(omes)*([^ost]|t([^rs]|r([^is]|i([^ns]|n[^gs])))|o([^ms]|m([^es]|e[^s]))))))))*(s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?$
Methode 2: Zeichenklasse
Anstatt .* zu verwenden , verwendet der folgende Ausdruck eine negierte Zeichenklasse [^/]:
`[^/]+/[^/]+/(.*)`
Dies entspricht allem bis zum dritten Backslash, aber Zeichenfolgen mit „somestring“ werden nicht ausgeschlossen.
Problemumgehung mithilfe von Capture-Gruppen
Da RE2 (das Go verwendet) keine Lookaheads unterstützt, können wir alle drei Teile erfassen der Zeichenfolge und überprüfen Sie den extrahierten Wert der Erfassungsgruppe:
import ( "fmt" "regexp" ) func main() { s := "anything/anything/somestring" r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`) val := r.FindStringSubmatch(s) if len(val) > 1 && val[1] != "somestring" { fmt.Println(val[1]) } else { fmt.Println("No match") } }
Dieser Ansatz erfasst die übereinstimmenden Werte und druckt sie aus, wenn sie nicht übereinstimmen „irgendeine Zeichenfolge“.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go-regulären Ausdrücken effektiv negative Übereinstimmungen ohne Umwege durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!