Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-08 20:51:04
avant
1069 Les gens l'ont consulté

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)
    }
  }
}
Copier après la connexion
Sortie :
<code>FooA
FooB
FooBa
FooBax
FooBxr
FooBarAbc
FooBarFoo
</code>
Copier après la connexion

Essayez-le sur rextester.
Mise à jour 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])
    }
  }
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!