Heim >Backend-Entwicklung >Golang >Wie kann ich in Go-regulären Ausdrücken effektiv negative Übereinstimmungen ohne Umwege durchführen?

Wie kann ich in Go-regulären Ausdrücken effektiv negative Übereinstimmungen ohne Umwege durchführen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-20 12:39:09465Durchsuche

How Can I Effectively Perform Negative Matching in Go Regular Expressions Without Lookarounds?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn