Heim  >  Artikel  >  Backend-Entwicklung  >  Regulärer Ausdruck mit Golang zur Übereinstimmung mit vollständigen Zeilen, die „error“ oder „warning“ enthalten (Groß- und Kleinschreibung wird nicht beachtet)

Regulärer Ausdruck mit Golang zur Übereinstimmung mit vollständigen Zeilen, die „error“ oder „warning“ enthalten (Groß- und Kleinschreibung wird nicht beachtet)

王林
王林nach vorne
2024-02-13 08:21:10394Durchsuche

正则表达式与 golang 匹配包含“错误”或“警告”(不区分大小写)的完整行

PHP-Editor Baicao stellt heute vor, wie man reguläre Ausdrücke verwendet, um vollständige Zeilen mit „Fehler“ oder „Warnung“ (ohne Berücksichtigung der Groß-/Kleinschreibung) in Golang abzugleichen. Reguläre Ausdrücke sind ein leistungsstarkes Tool zum Vergleichen von Textmustern, das uns dabei helfen kann, Inhalte zu finden, die einem bestimmten Muster in einer Zeichenfolge entsprechen. In Golang erfordert die Verwendung regulärer Ausdrücke die Einführung des Regexp-Pakets und die Verwendung der Compile-Funktion zum Kompilieren des regulären Ausdrucks. Als Nächstes stellen wir detailliert vor, wie reguläre Ausdrücke für den Zeilenabgleich in Golang verwendet werden.

Frageninhalt

Ich möchte dem Benutzer die vollständige Zeile jeder Zeile in der Protokolldatei ausdrucken, die eine Warnung oder einen Fehler enthält (ohne Berücksichtigung der Groß- und Kleinschreibung).

WO:

[01-17|18:53:38.179] info server/server.go:381 this would be skipped
[01-17|18:53:38.280] info server/server.go:620 this also
[01-17|18:53:41.180] warn server/server.go:388 something is warned, so show this
[01-17|18:53:41.394] warn server/server.go:188 something reported an ->error<-
[01-17|18:53:41.395] error server/server.go:191 blabla
[01-17|18:53:41.395] debug server/server.go:196 obviously skipped
[01-17|18:53:41.395] debug server/server.go:196 this debug contains an ->error<- so match this
[01-17|18:53:41.395] warn server/server.go:198 you get the idea

Ich möchte:

[01-17|18:53:41.180] warn server/server.go:388 something is warned, so show this
[01-17|18:53:41.394] warn server/server.go:188 something reported an ->error<-
[01-17|18:53:41.395] error server/server.go:191 blabla
[01-17|18:53:41.395] debug server/server.go:196 this debug contains an ->error<- so match this
[01-17|18:53:41.395] warn server/server.go:198 you get the idea

Ich habe unschuldig angefangen

errorregex := regexp.mustcompile(`(?is)error|warn`)

Es wird einfach gedruckt (aus einem anderen Lauf, stimmt möglicherweise nicht genau mit dem Beispiel oben überein)

warn
error

Dann dachte ich, ich sollte es ändern, damit es besser zu Folgendem passt:

errorRegEx := regexp.MustCompile(`(?is).*error.*|.*warn.*`)

Aber das druckt überhaupt nichts

Wie erhalte ich die vollständige Zeile und alle Zeilen, in denen Warnung oder Fehler (ohne Berücksichtigung der Groß- und Kleinschreibung) übereinstimmen?

ps: Dies ist nicht dasselbe wie die vorgeschlagene Regex-Übereinstimmungszeile, die eine Zeichenfolge enthält, da es sich um eine Frage speziell für die go-Sprache handelt, die anscheinend nicht genau dieselbe Standard-Engine verwendet.

Workaround

Angesichts der Tatsache, dass die Frage als betrügerisch markiert wurde, lautet der Kommentar des Op wie folgt.

Diese Frage ist als Duplikat markiert und der verlinkte Beitrag enthält viele Antworten, mit denen wir versuchen können, eine Antwort auf die Frage des OP zusammenzustellen. Sie ist jedoch immer noch nicht vollständig, da die Antworten anscheinend mit pcre und go zusammenhängen mit re2.

var logs = `
[01-17|18:53:38.179] info server/server.go:381 this would be skipped
[01-17|18:53:38.280] info server/server.go:620 this also
[01-17|18:53:41.180] warn server/server.go:388 something is warned, so show this
[01-17|18:53:41.394] warn server/server.go:188 something reported an ->error<-
[01-17|18:53:41.395] error server/server.go:191 blabla
[01-17|18:53:41.395] debug server/server.go:196 obviously skipped
[01-17|18:53:41.395] debug server/server.go:196 this debug contains an ->error<- so match this
[01-17|18:53:41.395] warn server/server.go:198 you get the idea
`

func init() {
    logs = strings.trimspace(logs)
}

Erstens verstehe ich nicht, warum dies nichts für op ausgibt :

Dann dachte ich, ich sollte es ändern, damit es besser zu Folgendem passt:

errorregex := regexp.mustcompile(`(?is).*error.*|.*warn.*`)

Aber das druckt überhaupt nichts

Weil alles gedruckt werden soll :

fmt.println("original regexp:")
reoriginal := regexp.mustcompile(`(?is).*error.*|.*warn.*`)
lines := reoriginal.findallstring(logs, -1)

fmt.println("match\t\tentry")
fmt.println("=====\t\t=====")
for i, line := range lines {
    fmt.printf("%d\t\t%q\n", i+1, line)
}
original regexp:
match           entry
=====           =====
1               "[01-17|18:53:38.179] info server/server.go:381 this would be skipped\n[01-17|18:53:38.280] info server/server.go:620 this also\n[01-17|18:53:41.180] warn server/server.go:388 something is warned, so show this\n[01-17|18:53:41.394] warn server/server.go:188 something reported an ->error<-\n[01-17|18:53:41.395] error server/server.go:191 blabla\n[01-17|18:53:41.395] debug server/server.go:196 obviously skipped\n[01-17|18:53:41.395] debug server/server.go:196 this debug contains an ->error<- so match this\n[01-17|18:53:41.395] warn server/server.go:198 you get the idea"

(?is)... 中的 s 标志表示将换行符与点匹配 (.)^1,并且因为您的星星 (*) ist gierig^2, wenn ein „Fehler“ oder eine „Warnung“ gefunden wird, stimmen sie mit allem in der gesamten Zeichenfolge überein.

Die eigentliche Lösung besteht darin, „n“ nicht mit Punkten abzugleichen – entfernen Sie die s-Flagge und Sie erhalten das gewünschte Ergebnis:

fmt.println("whole text:")
rewholetext := regexp.mustcompile(`(?i).*error.*|.*warn.*`)
lines = rewholetext.findallstring(logs, -1)

fmt.println("match\t\tentry")
fmt.println("=====\t\t=====")
for i, line := range lines {
    fmt.printf("%d\t\t%q\n", i+1, line)
}
whole text:
match           entry
=====           =====
1               "[01-17|18:53:41.180] warn server/server.go:388 something is warned, so show this"
2               "[01-17|18:53:41.394] warn server/server.go:188 something reported an ->error<-"
3               "[01-17|18:53:41.395] error server/server.go:191 blabla"
4               "[01-17|18:53:41.395] debug server/server.go:196 this debug contains an ->error<- so match this"
5               "[01-17|18:53:41.395] warn server/server.go:198 you get the idea"

Jetzt führen wir einen Abgleich zwischen „n“ Instanzen (gültigen Zeilen) durch, da wir das all-Formular verwenden, das nur nach nicht überlappenden Übereinstimmungen sucht:

Wenn „all“ vorhanden ist, sucht die Routine nach aufeinanderfolgenden, nicht überlappenden Übereinstimmungen des gesamten Ausdrucks. ^3

Wir erhalten vollständige und klare Linien.

Sie können diesen regulären Ausdruck etwas verschärfen:

`(?i).*(?:error|warn).*` // "anything before either "error" or "warn" and anything after (for a line)"

(?:...) ist eine nicht erfassende Gruppe ^1, weil Ihnen einzelne Vorkommnisse von „Fehler“ oder „Warnung“ in jedem Spiel egal zu sein scheinen.

Außerdem möchte ich immer noch zeigen, dass die Aufteilung nach Zeilen vor dem Versuch, eine Zuordnung vorzunehmen, Ihnen mehr Kontrolle/Präzision gibt und es sehr einfach macht, über reguläre Ausdrücke nachzudenken:

r := strings.newreader(logs)
scanner := bufio.newscanner(r)

fmt.println("line-by-line:")
reline := regexp.mustcompile(`(?i)error|warn`)

fmt.println("match\tline\tentry")
fmt.println("=====\t====\t=====")

var matchno, lineno, match = 1, 1, ""
for scanner.scan() {
    line := scanner.text()
    match = reline.findstring(line)
    if match != "" {
        fmt.printf("%d\t%d\t%q\n", matchno, lineno, line)
        matchno++
    }
    lineno++
}
Line-by-line:
match   line    entry
=====   ====    =====
1       3       "[01-17|18:53:41.180] Warn server/server.go:388 Something is warned, so show this"
2       4       "[01-17|18:53:41.394] warn server/server.go:188 Something reported an ->error<-"
3       5       "[01-17|18:53:41.395] Error server/server.go:191 Blabla"
4       7       "[01-17|18:53:41.395] DEBUG server/server.go:196 This debug contains an ->error<- so match this"
5       8       "[01-17|18:53:41.395] WARN server/server.go:198 You get the idea"

Alle drei Beispiele befinden sich auf diesem Spielplatz.

Das obige ist der detaillierte Inhalt vonRegulärer Ausdruck mit Golang zur Übereinstimmung mit vollständigen Zeilen, die „error“ oder „warning“ enthalten (Groß- und Kleinschreibung wird nicht beachtet). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen