2009-06-05 10 views
3

J'essaie de faire correspondre des chaînes comme '[sometext <someothertext>]' (c'est-à-dire, crochet gauche, texte, angle gauche, texte, équerre, droite) dans une colonne mySQL. A l'origine je la requête suivante (notez que depuis les requêtes regex sont échappés deux fois dans mySQL, vous devez utiliser deux barres obliques où vous utilisez normalement un):mySQL Regexp avec des crochets

SELECT * FROM message WHERE msgtext REGEXP '\\[(.+)?<(.+)?>\\]' 

Cette requête n'a reçu aucune erreur, mais il est revenu que je DIDN Je ne veux pas. Au lieu de (. +), Je voulais [^ \]] (faire correspondre tout sauf un crochet carré droit). Lorsque j'ai changé la requête, j'ai eu l'erreur suivante: "Got error 'répétition-opérateur opérande invalide' de regexp"

Après avoir lu la documentation mySQL here, il indique "Pour inclure un caractère littéral], il doit immédiatement suivez le crochet d'ouverture [. " Puisque je veux "^ \]" au lieu de "]", est-ce encore possible puisque le support ne peut pas être le premier caractère après le crochet d'ouverture? Voici quelques-unes des questions que j'ai essayé qui obtiennent la même erreur ci-dessus:

SELECT * FROM message WHERE msgtext REGEXP '\\[([^\\]]+?)<([^\\]]+?)>\\]' 
SELECT * FROM message WHERE msgtext REGEXP '\\[[^\\]]+?<[^\\]]+?>\\]' 
SELECT * FROM message WHERE msgtext REGEXP '\\[[^[.right-square-bracket.]]]+?<[^[.right-square-bracket.]]]+?>\\]' 

MISE À JOUR:

La requête suivante fonctionne sans erreurs, mais ne renvoie aucune ligne même si je sais qu'il ya des colonnes qui correspondent à ce que je recherche (basé sur ma requête initiale en haut):

SELECT * FROM message WHERE msgtext REGEXP '\\[([^\\]]+)?<([^\\]]+)?>\\]' 

Répondre

6

Cela fonctionne pour moi:

SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$'; 
0

Votre regex finale semble correct et fonctionne dans Firefox/JS une fois que les barres obliques sont non échappés. Il ne semble pas que MySQL supporte nativement les groupes de capture ... C'est peut-être le problème.

Peut-être que ce serait utile: http://mysqludf.com/lib_mysqludf_preg/

En outre, vous pouvez essayer un * au lieu de +? pour vos carrés droits niés. * 0 signifie 0 répétitions ou plus (gourmande)
+? signifie 1 ou plusieurs répétitions (paresseux)