Kann ich mit Go Regexp alles außer einer bestimmten Zeichenfolge finden?
Wie viele ähnliche Fragen gezeigt haben, erfolgt der Abgleich mit einer bestimmten Zeichenfolge mit Go Reguläre Ausdrücke können eine Herausforderung sein. Bei dieser Frage geht es darum, wie ein Abgleich mit einer Zeichenfolge im Format „irgendetwas/irgendetwas/somestring“ durchgeführt werden kann, wobei Zeichenfolgen, die „somestring“ enthalten, ausgeschlossen werden sollen.
Das Muster „/././(. )“ würde mit „somestring“ übereinstimmen, aber wir möchten mit allem außer diesem übereinstimmen. Die meisten vorgeschlagenen Lösungen verwenden „/././((?!somestring).),“, was in Go regexp nicht gültig ist, da es ein nicht quantifizierbares Token enthält.
Gos Regexp-Modul unterstützt keine Lookaheads, um lineare Ausführungszeitlimits (O(n)) sicherzustellen. Daher sind Problemumgehungen erforderlich.
Webdienst für negierte Muster
Ein Ansatz besteht darin, den Non-Match-Regex-Webdienst zu verwenden, um mit POSIX kompatible negierte Muster zu generieren. Für „somestring“ das generierte Muster ist:
^(1|s(s|o(s|m(s|es(omes)(s| t(s|r(s|i(s|ns)))|o(s|ms)))))(2|o( 3|m(4|e(1|s(omes)(5|t(6|r(7|i( 8|n9)))|o(3|m(4|e1)))))))))(s(s|o(s|m(s|es( O mes)(s|t(s|r(s|i(s|ns)))|o(s|ms))))))(o((me?)?|mes(omes )*(t(r?|rin?)|o(me?)?)?))?)?$
Ersetzen das letzte „(.*)“ mit „
/10/10/((1 |s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))) )(2|o(3|m(4 |e(1|s(omes)(5|t(6| r(7|i(8|n9)))|o( 3|m(4|e1)))))))))( 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?)?)?))?)?)$
This stellt sicher, dass die Regex nur den Teil nach dem dritten Backslash erfasst.
Alle drei Teile erfassen
Eine alternative Lösung erfasst alle drei Teile, an denen Sie interessiert sind. Nach der Überprüfung Wenn Sie den Wert der Erfassungsgruppe Nr. 1 angeben, können Sie entscheiden, was zurückgegeben werden soll:
package main import ( "fmt" "regexp" ) func main() { s := "anything/anything/somestring" r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`) val := r.FindStringSubmatch(s) // fmt.Println(val[1]) // -> somestring if len(val) > 1 && val[1] != "somestring" { // val has more than 1 element and is not equal to somestring? fmt.Println(val[1]) // Use val[1] } else { fmt.Println("No match") // Else, report no match } }
Das obige ist der detaillierte Inhalt vonWie kann ich Go Regexp verwenden, um alles außer einer bestimmten Zeichenfolge abzugleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!