Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/12/2020, à 19:08

thib1984

Aide regex

Bonjour bonjour...

Je cherche une regex un peu pointue (pour mon niveau) et je rencontre quelques difficultés :

L'objectif initial est de valider une "phrase" constituée d'une tache et de tags.
- Les tag sont placés en fin de phrases, séparés d'un espace et commencent par des dièses
- La tache peut contenir des espaces (mais pas commencer par un espace, et initialement ne devait pas contenir de dièses)

"my first task" -> OK
"my first task #tag1" -> OK
"my first task #tag1 #tag2" -> OK
"myfirsttask #tag1 #tag2" -> OK
"#tag1 #tag2" -> KO (la tache commence par un diese)
"myfirsttask #tag 1 #tag2" -> KO (un élement de la partie tags ne commence pas par un  dièse)
" myfirsttask #tag1 #tag2" -> KO (la tache commence par un espace)
"myfirst#task #tag1 #tag2" -> KO (la tache contient un diese)
"url myfirst#task #tag1 #tag2" -> KO (la tache contient un diese)

Du coup, j'étais arrivé à cette regex :

 ^([^# ])([^#])*( #[^ #]+)*$

qui fonctionnait bien.
Mais je veux maintenant tolérer le dièse dans la partie "tache" si et ssi il n'est pas précédé ou suivi d'un espace (afin de pouvoir stocker une url par exemple).
C'est à dire que le dernier exemple ci-dessus devienne OK :

"myfirst#task #tag1 #tag2" -> OK (la tache contient un diese mais celui-ci n'est pas précédé ou suivi d'un espace)
"url myfirst#task #tag1 #tag2" -> OK (idem)

Et là... je suis pommé...

Quelqu'un aurait l'amabilité de m'aider pour cette évolution?

Pour aide et vérification :

https://regex101.com/

 ^([^# ])([^#])*( #[^ #]+)*$

pour la partie REGULAR EXPRESSION

my first task
my first task #tag1
my first task #tag1 #tag2
myfirsttask #tag1 #tag2
myfirst#task #tag1 #tag2
url myfirst#task #tag1 #tag2

#tag1 #tag2
myfirsttask #tag 1 #tag2
 myfirsttask #tag1 #tag2
url myfirst#task # #tag2

pour la partie TEST STRING -le premier bloc doit passer intégralement, pas le second-

Dernière modification par thib1984 (Le 05/12/2020, à 19:18)

Hors ligne

#2 Le 05/12/2020, à 19:23

kamaris

Re : Aide regex

En prenant comme fichier d'entrée f les lignes que tu donnes plus haut avec les OK/KO :

$ sed -nE '/^"([^# ])([^#]|[^ ]#[^ ])*( #[^ #]+)*"/p' f
"my first task" -> OK
"my first task #tag1" -> OK
"my first task #tag1 #tag2" -> OK
"myfirsttask #tag1 #tag2" -> OK
"myfirst#task #tag1 #tag2" -> KO (la tache contient un diese)
"url myfirst#task #tag1 #tag2" -> KO (la tache contient un diese)
$ 

Sur le "vrai" exemple, il faut bien sûr retirer les guillemets dans la regex (et remettre le $ à la fin).

Dernière modification par kamaris (Le 05/12/2020, à 19:24)

Hors ligne

#3 Le 05/12/2020, à 19:51

thib1984

Re : Aide regex

Merci!

Du coup, pour reprendre le format initial,la regex que tu me donnes est :

^([^# ])([^#]|[^ ]#[^ ])*( #[^ #]+)*$

Merci encore de ton aide smile

Edit :

J'ai apporté deux corrections au final :
- my bad, finalement le # peut être suivi d'un espace dans la partie "task"
- il manquait des parenthèses après le "|"

^([^# ])([^#]|([^ ]#))*( #[^ #]+)*$

Dernière modification par thib1984 (Le 05/12/2020, à 21:46)

Hors ligne