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

王林
Freigeben: 2024-02-13 08:21:10
nach vorne
366 Leute haben es durchsucht

正则表达式与 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
Nach dem Login kopieren

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
Nach dem Login kopieren

Ich habe unschuldig angefangen

errorregex := regexp.mustcompile(`(?is)error|warn`)
Nach dem Login kopieren

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

warn
error
Nach dem Login kopieren

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

errorRegEx := regexp.MustCompile(`(?is).*error.*|.*warn.*`)
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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.*`)
Nach dem Login kopieren

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)
}
Nach dem Login kopieren
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"
Nach dem Login kopieren

(?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)
}
Nach dem Login kopieren
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"
Nach dem Login kopieren

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< /a>

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)"
Nach dem Login kopieren

(?:...) 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++
}
Nach dem Login kopieren
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"
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!