Go Regexp: Übereinstimmung mit dem vollständigen Wort oder der Teilzeichenfolge oder überhaupt nicht

WBOY
Freigeben: 2024-02-08 20:51:04
nach vorne
1068 Leute haben es durchsucht

Go Regexp:匹配完整单词或子字符串或根本不匹配

Frageninhalt

Ich versuche mit Go eine Möglichkeit zu finden, ein Muster mit regexp.Regexp abzugleichen.

Die Kriterien für den Wettbewerb sind wie folgt:

  1. Es muss mit FooBar 或其子字符串 Foo am Anfang der Zeile übereinstimmen oder überhaupt nicht.
  2. Bei Übereinstimmung in Nr. 1 müssen auf jede Übereinstimmung andere Zeichen folgen (z. B. S+)

Es sollte also zum Beispiel passen:

  • Übereinstimmungen: FooABC
  • Übereinstimmungen: FooBarABC
  • Passt nicht zu: FooBar (da keine weiteren Zeichen dahinter stehen)
  • Passt nicht zu: beginnend mit ABC(因为它不是以 Foo)

Ich habe verschiedene Ausdrücke ausprobiert, kann sie aber scheinbar nicht verstehen.

Ich habe festgestellt, dass es in anderen Implementierungen einen negativen Lookahead-Modus gibt, aber Go scheint ihn nicht bereitzustellen. Gibt es eine andere Möglichkeit, dieses Problem zu lösen?

Siehe (aktualisiert): https://regex101.com/r/SWSTzv/3

Ich weiß, dass dies offensichtlich ohne die Verwendung von regexp gelöst werden kann. Der Zweck dieser Anfrage besteht jedoch darin, zu verstehen, ob dieses Problem durch die stdlib-Implementierung von Go gelöst werden kann. regexp 的情况下解决。然而,这个请求的目的是了解这个问题是否可以通过 Go 的 stdlib 实现来解决。


正确答案


为什么不直接反转与正则表达式 ^Foo(?:Bar)?$

Richtige Antwort

Warum nicht einfach das Ergebnis umkehren, das dem regulären Ausdruck ^Foo(?:Bar)?$ entspricht (na ja, nicht nur )?

package main

import (
  "fmt"
  "regexp"
  "strings"
)

func main() {
  re := regexp.MustCompile(`^Foo(?:Bar)?$`)
  str := `Foo
FooBar
FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
ABC
AbcFooBar`

  for _, s := range strings.Split(str, "\n") {
    if strings.HasPrefix(s, "Foo") && !re.MatchString(s) {
      fmt.Println(s)
    }
  }
}
Nach dem Login kopieren
Ausgabe:
<code>FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
</code>
Nach dem Login kopieren

Probieren Sie es auf rextester aus.
Update Eine weitere basierend auf regulären Ausdrücken und der Verwendung von

Tipps

.

package main

import (
  "fmt"
  "regexp"
  "strings"
)

func main() {
  re := regexp.MustCompile(`^Foo$|^FooBar$|^(Foo.+)`)
  str := `Foo
FooBar
FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
ABC
AbcFooBar`

  for _, s := range strings.Split(str, "\n") {
    submatches := re.FindStringSubmatch(s)
    if submatches != nil && submatches[1] != "" {
      fmt.Println(submatches[1])
    }
  }
}
Nach dem Login kopieren

Probieren Sie es auf 🎜rextester🎜 aus. 🎜

Das obige ist der detaillierte Inhalt vonGo Regexp: Übereinstimmung mit dem vollständigen Wort oder der Teilzeichenfolge oder überhaupt nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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!