3
votes

RegEx pour faire correspondre l'exercice de référence avant

Je travaille sur un exercice sur la référence en aval des regex comme celui demandé ici

La tâche est:

    La
  • chaîne s se compose de tic ou tac
  • tic ne doit pas être son voisin immédiat
  • Le premier tic doit se produire uniquement lorsque tac est apparu au moins deux fois avant

J'ai utilisé cette regex pour le résoudre. Mais il n'utilise pas de référence avant , donc je veux vraiment savoir comment cela peut être résolu en l'utilisant.

tactactictactictictac
tactictac

Valide strong>:

tactactic
tactactictactic

Non valide :

^tac(tac)+(tic(tac)+){0,}(tic)?$

Comment résoudre ce problème?


4 commentaires

Votre propre regex ne correspond pas aux chaînes avec plus de deux tac au début, par exemple tactactactic . Vous avez déjà votre réponse mais en cas de performance, vous devriez choisir une expression régulière plus légère: ^ (tac) (\ 1 + tic) + \ 1 * $


@revo C'est aussi une excellente solution, pourquoi ne pas la poster?


@Thefourthbird J'ai l'impression que cela ne répond pas à la question car OP demande explicitement une solution avec des références directes impliquées qui sont déjà données.


@revo Vous avez raison, je suppose que l'exercice n'a pas eu assez de cas. Et le vôtre fonctionne très bien aussi.


3 Réponses :


1
votes

S'il doit y avoir au moins 2 tics dans la chaîne, vous pouvez utiliser une anticipation négative pour affirmer qu'il n'y a pas de tictique présent et commencer par faire correspondre et au moins 2 fois tic

^(?:(?:tac)+|(?!.*(tictic))(?:tac){2,}tic(?:t[ia]c)*)$
  • ^ Début de chaîne
  • (?: Groupe sans capture
    • (?: tac) + Répéter 1+ fois uniquement tac
    • | Ou
    • (?!. * (tictic)) Affirmer que ce qui est à droite ne contient pas de tactac
    • (?: tac) {2,} (?: t [ia] c) * Répétez plus de 2 fois tac suivi de tic et répétez tic ou tac 0+ fois jusqu'à la fin du chaîne
  • ) Fermer le groupe non capturant
  • $ Fin de chaîne

Démo Regex


1 commentaires

Vous n'avez pas tout à fait compris le jeton gourmand tempéré mais pouvez-vous en montrer un impliquant également une référence avant ? Merci



1
votes

Cette simple expression régulière devrait être assez bonne sans aucun regard autour de vous ni jeton gourmand tempéré car ils sont assez chers en termes de correspondance.

^tac(tac(?:tic)?)+$

Explication: p>

  • ^ tac - Début de chaîne avec tac
  • (tac (?: tic)?) + - Cela correspond à tac éventuellement suivi de tic en raison de laquelle il n'y a pas deux tic se produira jamais ensemble, et comme tic est facultatif ici, il permet donc de faire correspondre tac autant de fois que nécessaire pour correspondre au modèle. li >
  • $ - Fin de chaîne

Démo Regex


6 commentaires

tactactictactic ne devrait-il pas être valide?


Vous avez tous les deux raison. Pris soin des deux modèles. Vérifiez s'il vous plaît


Merci d'avoir répondu, mais pouvez-vous également accepter la référence avant (mais pas de manière redondante)


@ greeny1234: Je suis désolé mais je ne sais pas comment vous appelez renvoi de référence . Voulez-vous dire un regard positif sur l'avenir?


J'ai mis un lien dans la question


Ok, laisse-moi vérifier.



1
votes

Ceci utilise une référence avant:

^(\2tic|(tac))+$

Démo

C'est en fait très similaire à l'exemple donné sur cette page .


1 commentaires

Je vous remercie. J'ai essayé comment la référence avant pourrait être utilisée pour résoudre et c'est tout