Sujet : [RÉSOLU] Vérifier la présence d'un mot dans tous les champs
De : om+news (at) *nospam* miakinen.net (Olivier Miakinen)
Groupes : fr.comp.lang.regexpDate : 05. Apr 2022, 16:28:13
Autres entêtes
Organisation : There's no cabale
Message-ID : <t2hn6e$2qb0$1@cabale.usenet-fr.net>
References : 1 2 3
User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0 SeaMonkey/2.53.1
Bonjour,
Après vérifications et tests, je confirme que les deux regexp trouvées
fonctionnent comme prévu. Afin que ce groupe conserve un rôle pédago-
gique voici une explication pour chacune.
Dans une phrase comportant plusieurs mots séparés entre autres par des
virgules, je voudrais vérifier qu'un mot en particulier se trouve dans
chaque partie de la phrase.
La regexp suivante semble convenir :
/^[^,]*cœur[^,]*(,[^,]*cœur[^,]*)*$/
On peut décomposer cette regexp en : /^RE(,RE)*$/
avec : RE=[^,]*cœur[^,]*
Chaque RE correspond à une chaîne de caractères sans aucune virgule
mais contenant au moins une fois le mot cœur.
Quand au test global, il vérifie qu'il y a bien une sous-chaîne de
type RE au début, puis qu'à chaque fois qu'on rencontre une virgule
celle-ci est suivi d'une autre sous-chaîne de type RE, et ce jusqu'à
la fin.
[...] ma
question d'origine qui est le contraire : vérifier qu'il existe au
moins l'une des parties de la phrase ne contenant *pas* ce mot.
Pour cette version, la regexp suivante a l'air d'aller :
/(^|,)([^,](?!cœur))*(,|$)/
Ici, le cœur (sic) de la regexp peut s'écrire :
/(^|,)([^,])*(,|$)/
voire, encore plus simplement :
/(^|,)[^,]*(,|$)/
Cette regexp consiste à considérer indépendamment chaque sous-chaîne
délimitée soit par des virgules, soit par le début ou la fin de la
chaîne.
- à gauche, le début de la chaîne ou une virgule : (^|,)
- à droite, une virgule ou la fin de la chaîne : (,|$)
- entre les deux, une séquence de caractères sans virgules : [^,]*
Mais en outre on veut vérifier que nulle part à l'intérieur de cette
sous-chaîne on ne rencontre le mot cœur. Ceci est réalisé par une
assertion à chaque non-virgule (à chaque [^,]) pour vérifier qu'à
cet endroit là ce n'est pas suivi par le mot cœur : (?!cœur).
Le test complet « il y a un caractère qui n'est pas une virgule et
qui n'est pas suivi par le mot cœur » est : ([^,](?!cœur))
Il n'y a plus qu'à le répéter n fois (multiplicateur *) et à
l'insérer entre le test de début et le test de fin de sous-chaîne.
Et voilà ! Encore merci à Otomatic, et à une prochaine fois pour de
nouvelles aventures regexpiennes.
-- Olivier Miakinen