Maison >développement back-end >Golang >Go Regexp : fait correspondre le mot complet ou la sous-chaîne ou pas du tout

Go Regexp : fait correspondre le mot complet ou la sous-chaîne ou pas du tout

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBavant
2024-02-08 20:51:041242parcourir

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

Contenu de la question

J'essaie de trouver un moyen de faire correspondre un motif avec regexp.Regexp en utilisant Go.

Les critères du concours sont les suivants :

  1. Il doit correspondre FooBar 或其子字符串 Foo au début de la ligne, ou pas du tout.
  2. En cas de correspondance dans #1, toute correspondance doit être suivie par d'autres caractères (c'est-à-dire S+)

Donc, cela devrait correspondre, par exemple :

  • Matchs : FooABC
  • Matchs : FooBarABC
  • Ne correspond pas à : FooBar (car il n'y a pas d'autres caractères après)
  • Ne correspond pas : commençant par ABC(因为它不是以 Foo)

J'ai essayé différentes expressions mais je n'arrive pas à les comprendre.

J'ai trouvé que le mode d'anticipation négative existe dans d'autres implémentations, mais Go ne semble pas le fournir. Existe-t-il un autre moyen de résoudre ce problème ?

Voir (mis à jour) : https://regex101.com/r/SWSTzv/3

Je sais que cela peut évidemment être résolu sans utiliser regexp. Cependant, le but de cette requête est de comprendre si ce problème peut être résolu par l'implémentation stdlib de Go. regexp 的情况下解决。然而,这个请求的目的是了解这个问题是否可以通过 Go 的 stdlib 实现来解决。


正确答案


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

Bonne réponse

Pourquoi ne pas simplement inverser le résultat qui correspond à l'expression régulière ^Foo(?:Bar)?$ (enfin, pas seulement ) ?

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

Essayez-le sur rextester.
Mise à jour em> Un de plus basé sur des expressions régulières et utilisant des

astuces

.

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])
    }
  }
}

Essayez-le sur 🎜rextester🎜. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer