problème de regex

Dr, j'ai une regexite aiguë !

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous ! Cela fait un bout de temps que je n'ai pas codé en PHP, mais comme ça commençais à me démanger grave, et que j'ai besoin de monter un site pour un prochain projet, ben je m'y suis remis :)

Mon problème se situe sur la construction d'une REGEX…bon, autant vous le dire tt de suite, les REGEX et moi, c'est pas une histoire d'amour :P ! Je suis hermétique à la syntaxe des regex, j'ai beau lire des cours, tenté de m'exercer, rien à faire…et ma récente tentative de mise à niveau de ces dernier jours ne résout pas le problème, ça rentre pas, ça rentre pas :(

Bon, du coup, me voila complètement coinçé, et j'ai vraiment besoin de votre aide pour écrire cette #$!*\^#(<= ceci n'est pas une regex :D ) de REGEX !

Voici ce que j'essaie de filtrer :

  • un sous-ensemble de lettres minuscules et/ou chiffre (bla, 222, b2abrz…)

[\w]+ si j'ai bien compris

  • ce sous ensemble peut exister plusieurs fois, en étant obligatoirement relié par "-" (bla-br2t-rbz4....)

là, je pêche un peu :P , ^[\w]-?[\w]$ ne semble pas correct…pourquoi ?

  • ce sous-ensemble ne peut pas commencer ni ce finir par "-" (donc lettre ou chiffre uniquement)

^[\w] et [\w]$ si je ne me goure pas

  • ce sous ensemble est ensuite englobé dans un ensemble qui doit obligatoirement commencé par "/" (/bla, /b45-re, /bre-212-r2t…)

^\/ sauf erreur de ma part

cet ensemble peut être multiplié x fois (/bret/r2ty-aze/222/tra)

{1,}

Dans un premier temps, j'aurais bien besoin que vous me confirmiez tout mes Image utilisateur :) !

Merci par avance pour l'aide que vous pourrais m'apporter sur ce douloureux (si si,j'ai des regex douloureuses :D ) problème !

Édité par babas

Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison.... Mais allez savoir si j’ai raison !

+0 -0

Bonjour,

Je t'invite à regarder du coté de ce site.

\w c'est n'importe quel caractère alphanumérique (majuscule ou non) donc c'est pas ça. [a-z0-9] fonctionnera

pour en avoir plusieurs reliés par des tirets :

1
[a-z0-9]+(\-[a-z0-9]+)*

+ pour dire 1 ou plus, * pour dire 0 ou plus. (équivalents de {1,} et {0,}

le reste est bon.

Autre ressource : pour voir le résultat

Édité par Xia

Xia, peluche olympienne |Python en s'amusant | Random xkcd

+0 -0
Auteur du sujet

en effet, j'ai confondu facultatif multipliable et obligatoire multipliable :)

J'ai pu rajouter sans encombre les début et fin de chaine obligatoire, reste à implémenté le "/" de début, et rendre le tout multipliable…merci pour ce début :) !

Ho, les beau lien que je garde précieusement !

PS : t'à pas un lien d'un site qui fait l'inverse (genre tu lui décris ce que tu veut et PAF ! il te pond la regex :D ! )

Édité par babas

Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison.... Mais allez savoir si j’ai raison !

+0 -0

PS : t'à pas un lien d'un site qui fait l'inverse (genre tu lui décris ce que tu veut et PAF ! il te pond la regex :D ! )

babas

J'ai pas ça en stock, mais ça doit exister. Y a des programmes qui resolves automatiquement les problèmes de regex golf. un petit truc interactif doit bien exister… Si ce n'est pas le cas, développe le, et viens nous le présenter!

Xia, peluche olympienne |Python en s'amusant | Random xkcd

+0 -0
Auteur du sujet

re-coucou !

bon, voici ma version de la regex :

1
#^(/([a-z0-9]+(\-[a-z0-9]+)*))*$#

J'ai fait quelques tests, ça semble correct au premier abord, mais j'aimerais néanmoins avoir votre avis pour savoir si :

  • Elle est correctement écrite
  • Elle ne peut pas être optimisée

Xia, j'ai tenté de passé ma regex à la moulinette de tes liens, j'avoue, j'ai pas compris la réponse que ces sites m'ont donné :D !

Édité par babas

Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison.... Mais allez savoir si j’ai raison !

+0 -0

Il manque un backslash pour échapper le premier slash. Ici, tu vois tous les chemins qui valident la regex. Tu remarquera que la dernière étoile permet de valider avec une chaine vide. si tu mets un plus à la place, tu oblique à avoir au moins un groupe de caractères.

, tu peux voir ta regex en action. tu peux modifier la chaine de caractères pour voir ce qui est valide ou non. La partie de droite te montre le résultat de la fonction match.

Edit : j'ai réussi à faire mon lien avec parenthèses

Édité par Xia

Xia, peluche olympienne |Python en s'amusant | Random xkcd

+0 -0
Auteur du sujet

Merci Xia :)

Pour le +/* , j'aurais du m'en apercevoir tout seul…

pour le \/, c'est surprenant, ça fonctionne sans Oo !

enfin, merci pour la description de tes lien, je pige un peu le principe de base :) !

Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison.... Mais allez savoir si j’ai raison !

+0 -0

En ce qui concerne le /, tu ne dois l'échapper que s'il te sert de délimiteur pour ta regex. Or, comme tu te sers du #, tu n'as pas besoin d'échapper tes slashs (mais du coup tu dois échapper tes dièses).

+2 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte