Heim  >  Artikel  >  Backend-Entwicklung  >  Go Regexp: Übereinstimmung mit dem vollständigen Wort oder der Teilzeichenfolge oder überhaupt nicht

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

WBOY
WBOYnach vorne
2024-02-08 20:51:041047Durchsuche

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)
    }
  }
}
Ausgabe:
<code>FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
</code>

Probieren Sie es auf rextester aus.
Update em> 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])
    }
  }
}

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!

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