J'ai une chaîne qui pourrait avoir un-nom suivie d'une valeur (pouvant avoir des espaces) et il pourrait également y avoir-les -descr après cela suivi d'une valeur (la valeur suivie d'une valeur peut ne pas être là):
Exemple Strings: P>
regexp.MustCompile(`(-name ).+?=-descr`)
3 Réponses :
par "ne fonctionne pas", voulez-vous dire que cela ne correspond pas à rien, ni tout ce que vous attendez? p>
https://regex101.com/ est généralement très utile lorsque vous testez des expressions régulières. P>
Je ne crois pas qu'il y ait un moyen simple d'atteindre ce que vous voulez. Les choses deviennent beaucoup plus simples si nous pouvons assumer le texte entre Avec ce genre de chose, souvent plus facile et plus clair d'utiliser 2 expressions régulières. Donc, les premières bandes -Name code> et -Descr code> ne contient aucun - code> auquel cas, Regex.MustComposspile (Name (nom ([^ -] *) `) code> devrait fonctionner p>
-Descr code> et quoi que ce soit, et le premier correspondant -Name code> et tous les caractères suivants. P>
Le texte entre -Name et -Descrire ne contient pas -
Vous pouvez capturer la première partie avec Ensuite, vous pouvez utiliser les groupes de capture lors de la création du résultat souhaité. p> Démo Regex | Go Demo P> Par exemple: P> -Name code> dans un groupe, puis correspond à ce qui se passe entre et utilisez un deuxième groupe de capture en option pour correspondre -DesCr code> et ce qui suit. runcmd -name...-descr abc def
Est-il possible de modifier cela afin que le premier groupe contient uniquement UPTL -Name? Nom? La raison en est que je devrais éventuellement avoir besoin de faire quelque chose comme RE1.ReplaceAllstring (S, "1 $" + "...." + "")), je peux donc renvoyer la chaîne d'origine juste avec la valeur de -Name remplacée par ...., la chaîne de sortie devient donc runcmd -name ... -descr abc def code> qui est l'objectif final
@ user1892775 Pour obtenir uniquement le premier groupe que vous puissiez utiliser ^ (. *? -Name) code> Demo . Dans ce cas, vous pouvez également utiliser juste une correspondance à la place ^. *? -Name code> Démo et cela pourrait ressembler à ce Go Demo
Pas sûr, si j'étais assez clair, je veux modifier le regexp afin que S: = "runcmd -name ABCD XYZ -DESCR ABC def" RE1: = REGEXP.MUSTCOMPILE (REGEXP) FMT.PRINTLN (RE1.REPLACEABLING (S, "1 $" + "...." + "")) devrait être `runcmd -name ... -descr abc def"
Si vous pouviez partager un exemple qui donnerait cette sortie (la chaîne avec valeur pour le nom remplacé par ....) Comme indiqué dans le code ci-dessus, cela aiderait vraiment
@ user1892775 Voulez-vous dire que vous utilisez 2 groupes de capture? Ideone.com/votdlz
Désolé si sa confusion est confuse. Laissez-moi essayer de le rendre plus simple. Pour INPUTSTSTR = "RunCMD -Name ABCD XYZ -DESCR ABC DEF", je veux que la sortie soit "Runcmd -Name ... -descr abc def"
@ user1892775 Vous pouvez concaténer les groupes Ideone.com/ahwa3l
Ouais, mais alors il semblerait échouer pour l'introuvable S = "RunCMD -Name ABCD XYZ" (c'est-à-dire lorsque l'option -descr est manquante)
@ user1892775 Dans ce cas, vous pouvez faire le deuxième groupe de capture facultatif ideone.com/v6bgpf
@ user1892775 J'ai mis à jour ma réponse avec le dernier exemple.
Laissez-nous Continuez cette discussion en chat .
Vous ne faites pas affaire avec une langue régulière ici, il n'ya donc aucune raison de faire sortir le moteur (lent) Regexp. Le paquet Strings est assez assez:
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
fmt.Printf("%q\n", f("runcmd -name abcd xyz -descr abc def"))
fmt.Printf("%q\n", f("runcmd -name abcd xyz"))
fmt.Printf("%q\n", f("-descr abc def"))
}
func f(s string) string {
if n := strings.Index(s, "-descr"); n >= 0 {
return strings.TrimRightFunc(s[:n], unicode.IsSpace)
}
return s
}
// Output:
// "runcmd -name abcd xyz"
// "runcmd -name abcd xyz"
// ""
Lorsque vous dites quelque chose "ne fonctionne pas", il est important d'expliquer Comment i> - erreur, comportement incorrect (et spécifier quoi), etc. Juste de la recherche sur le code, votre regex recherche un String avec un
= code> dedans, mais vos exemples ne contiennent pas ce caractère.Si vous pouvez utiliser un groupe de capture, essayez
^ (. *? -Name. *?) (?: * -Descr | $) code> DemoDevrait
-Descr code> être là? Parce que ce n'est pas dans le deuxième exemple.@Thefourthbird, ce groupe de capture fonctionnera-t-il avec Golang? Pouvez-vous dire à la syntaxe d'utiliser avec Regex.MustCompile?
Je veux exclure -DesCr du match
Je veux dire si vous correspondez également à
runcmd -name abcd xyz code> quand il n'y a pas-Descr code> suivi?Oui, quand il n'y a pas de document, il devrait correspondre et retourner
runcmd -name abcd xyz code>Pourquoi utiliser une regex pour une tâche aussi simple?