2014-07-07 2 views
1

Je rencontre un problème de requête. J'utilise mysql comme DB. Je veux utiliser une expression régulière pour correspondre au résultat prévu et le tableau estRegex match dans MySQL pour mot répété

table A 

---------------------------------- 
| ID | Description   | 
---------------------------------- 
| 1 | new 2 new 2 new 2 new | 
| 2 | new 21 new 2 new  | 
| 3 | new 12th 2   | 
| 4 | 2new 2new   | 
| 5 | new2 new 2new  | 

Le résultat que j'attendais
- numérique 2 ne peut montrer deux fois
- caractère avant/après 2 doit être varchar (sauf après des espaces)

Table B 
    --------------------------------- 
    | ID | Description   | 
    --------------------------------- 
    | 4 | 2new 2new   | 
    | 5 | new2 new 2new  | 

La requête que j'ai jusqu'à présent:

SELECT * FROM a WHERE 
(description REGEXP '^[^2]*2[^2]*2[^2]*$') 

click here for sqlfiddle demo

Quelqu'un pourrait-il m'aider à résoudre ce problème?

+1

Pouvez-vous épeler votre logique? –

+0

Le résultat attendu - le numérique 2 ne peut afficher que deux fois - caractère après/avant 2 doit être varchar (sauf après espace) – muhnizar

+0

Que signifie _ "caractère après/avant 2 doit être varchar" _? –

Répondre

2

Utilisez la regex ci-dessous pour obtenir la description des quatrième et cinquième ID.

SELECT * FROM a WHERE 
(description REGEXP '^2[^2]*2[^2]*|\w+2[^2]*2[^2]*$') 

http://sqlfiddle.com/#!2/1284e/18

Explication:

  • Diviser la regex ci-dessus en deux comme 2[^2]*2[^2]* comme une partie et une autre partie comme \w+2[^2]*2[^2]*. Dans regex ^ représente le point de départ et $ représente le point final.
  • 2[^2]*2[^2]*

    • 2 correspond au numéro 2.
    • [^2]* correspond à un caractère non de 2 zéro fois ou plus.
    • 2 Correspond au numéro 2.
    • [^2]* Correspond à tout caractère différent de 2 zéro ou plus.
    • Ceci vous obtiendrait le 4ème ID.
  • | Un opérateur logique OU habituellement utilisée pour combiner deux expressions rationnelles qui signifie en jeu soit présent (avant) ou qui (après).

  • \w+2[^2]*2[^2]*

    • \w+2 correspond à un ou plusieurs caractères de mots qui devraient être suivies par le numéro 2. Dans votre exemple, 5ème ID satisfait cette regex.
    • [^2]* Correspond à tout caractère différent de 2 zéro ou plus.
    • 2 Correspond au numéro 2.
    • [^2]* Correspond à tout caractère différent de 2 zéro ou plus.
    • Cela vous obtiendrez le 5ème ID.
+0

le résultat est correct..mais-tu m'expliquer la logique de la regex! merci – muhnizar

+0

J'ai besoin d'une autre aide de votre part .. ça vous dérange? :) @AvinashRaj J'essaie de changer l'expression pour être plus général (limité à tous les chiffres)
[sql fiddle demo] (http://sqlfiddle.com/#!2/fcc49/1)
mais en quelque sorte j'ai toujours eu le mauvais résultat.
désolé de vous déranger! – muhnizar

+0

@muhnizar voulez-vous les mêmes valeurs id4 et ID5? –