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