Pages : 1
#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 :
^([^# ])([^#])*( #[^ #]+)*$
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)
Mainteneur Xfce : https://gravatar.com/gaelbonithon
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
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
Pages : 1