-2
votes

Golang Regexp pour faire correspondre la chaîne jusqu'à une séquence de caractères donnée

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`)


8 commentaires

Lorsque vous dites quelque chose "ne fonctionne pas", il est important d'expliquer Comment - erreur, comportement incorrect (et spécifier quoi), etc. Juste de la recherche sur le code, votre regex recherche un String avec un = dedans, mais vos exemples ne contiennent pas ce caractère.


Si vous pouvez utiliser un groupe de capture, essayez ^ (. *? -Name. *?) (?: * -Descr | $) Demo


Devrait -Descr ê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 quand il n'y a pas -Descr suivi?


Oui, quand il n'y a pas de document, il devrait correspondre et retourner runcmd -name abcd xyz


Pourquoi utiliser une regex pour une tâche aussi simple?


3 Réponses :


0
votes

par "ne fonctionne pas", voulez-vous dire que cela ne correspond pas à rien, ni tout ce que vous attendez?

https://regex101.com/ est généralement très utile lorsque vous testez des expressions régulières.

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 -Name et -Descr ne contient aucun - auquel cas, Regex.MustComposspile (Name (nom ([^ -] *) `) devrait fonctionner

Avec ce genre de chose, souvent plus facile et plus clair d'utiliser 2 expressions régulières. Donc, les premières bandes -Descr et quoi que ce soit, et le premier correspondant -Name et tous les caractères suivants.


1 commentaires

Le texte entre -Name et -Descrire ne contient pas -



0
votes

Vous pouvez capturer la première partie avec -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.

Ensuite, vous pouvez utiliser les groupes de capture lors de la création du résultat souhaité. p> xxx pré>

Démo Regex | Go Demo P>

Par exemple: P>

runcmd -name...-descr abc def


11 commentaires

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 qui est l'objectif final


@ user1892775 Pour obtenir uniquement le premier groupe que vous puissiez utiliser ^ (. *? -Name) Demo . Dans ce cas, vous pouvez également utiliser juste une correspondance à la place ^. *? -Name 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 .



0
votes

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"
// ""


0 commentaires