2009-08-03 7 views
2

Je veux correspondre une chaîne qui ressemble à ceci:besoin REGEXP Matching dans MySQL

[lang_de]Hallo![/lang_de][lang_en]Hello![/lang_en]HeyHo[lang_es]Hola![/lang_es] 

Je veux que le correspondant pour revenir vrai s'il y a du texte qui n'est pas entouré par lang_tags (dans cet exemple: HeyHo) . Il pourrait également être positionné au début ou à la fin de la chaîne.

Les espaces blancs ne doivent PAS correspondre, par ex. [lang_de]Tisch[/lang_de] [lang_en]Table[/lang_en] ne devrait pas provoquer une correspondance.

Je ne peux pas utiliser lookahead ou lookback, parce que MySQL ne semble pas supporter cela.

Avez-vous des suggestions?

Répondre

2

Essayez cette regex:

'^ *[^[ ]|\\[/lang_[a-z]{2}\\] *[^[ ]' 

Voici comment vous pouvez l'utiliser:

select * 
from <table> 
where <field> regexp '^ *[^[ ]|\\[/lang_[a-z]{2}\\] *[^[ ]' 

Il devrait traiter tous les cas:

  • Avant
  • Après
  • Moyen
  • Pas des espaces
+0

Je ne peux pas vraiment comprendre votre REGEX (ours avec moi je suis noobish), mais il semble fonctionner;) VOUS êtes mon ROCKSTAR! –

+0

Si c'est la solution que vous avez choisie et qui a fonctionné pour vous, vous devez le marquer comme tel. Il devrait être juste par l'indicateur de vote haut/bas. –

+0

Vous ne pouvez pas encore mettre en doute, solution marquée –

0

ma meilleure tentative:

SELECT * FROM tbl1 WHERE ('[lang_de]Hallo![/lang_de][lang_en]Hello![/lang_en]HeyHo[lang_es]Hola![/lang_es]' NOT REGEXP '^(\\[lang_[a-z]{2}\\][^\[]*\\[\\/lang_[a-z]{2}\\])*$') 

Dites-nous comment vous avez obtenu sur.

+0

Le problème avec cette regex est que l'opérateur * est gourmand, donc il ne fonctionne pas avec les données de test fournies. Donc, ce qui arrivera, c'est que votre premier [lang_ *] correspondra à [lang_de] et le second [/ lang_ *] correspondra à [/ lang_es]. Donc, il ne se répète pas du tout et pense que cela correspond avec succès. Il résoudra cependant le problème du texte au début ou à la fin de la chaîne. – Senseful

+0

Oui vrai, je suis toujours mordu par. * –

+0

Vrai, il m'arrive assez souvent ... apprendre à regexp est assez difficile –