Page 1 sur 1

Expression régulière et négation

Posté : 02 janv. 2008, 13:53
par praline
Bonjour,

Je voudrai tester une chaine pour vérifier qu'elle commence bien par "xxxx" et que "yyyy" ne suit pas derrière (soit une négation du mot "yyyy")

Exemple: tester si la chaine "coucoutoi" commence bien par "coucou" et que le mot "moi" ne suit pas derrière (soit une négation du mot "moi")

Donc en remplaçant "expression" par a bonne expression régulière, je souhaiterait obtenir ca:

Code : Tout sélectionner

SELECT 'coucoutoi' REGEXP 'expression'
=> 1

Code : Tout sélectionner

SELECT 'coucoumoi' REGEXP 'expression'
=> 0

J'ai trouver l'expression régulière PERL qui fonctionne: ^coucou(?!(moi))
Mais mysql utilise les expression POSIX, ce qui explique le message d'erreur:

Code : Tout sélectionner

#1139 - Got error 'repetition-operator operand invalid' from regexp
Merci de votre aide !

Posté : 02 janv. 2008, 14:04
par sadeq
c'est le chapeau ^ qui joue le rôle de négateur, essaye l'expression :
^coucou(^(moi))

Posté : 17 janv. 2008, 19:10
par praline
apparament non ... la requete suivant renvoi toujours 0, que je mettre 'coucoutoi' ou 'coucoumoi'

Code : Tout sélectionner

SELECT 'coucoutoi' REGEXP '^coucou(^(moi))'
D'après la doc, le "^" représente le début de chaine, et non la négation

Posté : 17 janv. 2008, 22:37
par Sékiltoyai
Euh, sadeq, que ce soit la doc fr ou en, ils ne parlent à aucun moment que le ^ peut être utilisé comme négation (à part bien sur négation de classes) :-/

Posté : 18 janv. 2008, 07:36
par sadeq
Hé bien, le plus simple est d'écrire :

Code : Tout sélectionner

NOT SELECT '..............' REGEXP '^coucoumoi'
Car les regexp sont faites à la base pour reconnaitre l'existence de mots et non l'inverse. Il suffit donc d'inverser le résultat.

Posté : 18 janv. 2008, 11:38
par praline
Oui effectivement, mais ce n'est pas ce que je cherche a faire.
Je veux une chaine qui commence par "coucou" et que le mot "moi" ne doit pas suivre.
Je ne cherche pas une chaine qui commencerai par "coucoutoi" ! :D

Posté : 18 janv. 2008, 12:06
par Sékiltoyai
Tu peux faire

Code : Tout sélectionner

SELECT 'coucoutoi' REGEXP '^coucou(.*)' AND NOT REGEXP '^coucoutoi'