Expression régulière et négation

Eléphanteau du PHP | 13 Messages

02 janv. 2008, 13:53

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 !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 janv. 2008, 14:04

c'est le chapeau ^ qui joue le rôle de négateur, essaye l'expression :
^coucou(^(moi))
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 13 Messages

17 janv. 2008, 19:10

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

ViPHP
ViPHP | 5924 Messages

17 janv. 2008, 22:37

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) :-/

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 janv. 2008, 07:36

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.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 13 Messages

18 janv. 2008, 11:38

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

ViPHP
ViPHP | 5924 Messages

18 janv. 2008, 12:06

Tu peux faire

Code : Tout sélectionner

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