web-dev-qa-db-fra.com

Limites Oracle REGEXP_LIKE et Word

Je rencontre un problème de correspondance des limites de Word avec REGEXP_LIKE. La requête suivante renvoie une seule ligne, comme prévu.

select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');

Mais je veux aussi correspondre aux limites de Word. Donc, ajouter les caractères "\ b" donne cette requête

select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');

En cours d'exécution, cela ne renvoie aucune ligne. Des idées?

29
Greg Reynolds

Je crois que tu veux essayer

 select 1 from dual 
  where regexp_like ('does test work here', '(^|\s)test(\s|$)');

parce que le \b ne figure pas dans cette liste: http://download.Oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007670

Le \s s'assure que le test commence et se termine dans un espace. Cela ne suffit toutefois pas, car la chaîne test peut également apparaître au tout début ou à la fin de la chaîne recherchée. Par conséquent, j'utilise le alternative (indiqué par le |) ^ pour le début de la chaîne et $ pour la fin de la chaîne.

Mise à jour (après 3 ans et plus) ... En l'occurrence, j'avais besoin de cette fonctionnalité aujourd'hui, et il me semble qu'une expression rationnelle est encore meilleure (^|\s|\W)test($|\s|\W) ( La balise manquante\b expression régulière spéciale caractère dans Oracle ).

46
René Nyffenegger

La regex la plus courte pouvant vérifier un mot entier dans Oracle est

(^|\W)test($|\W)

Voir la démo regex .

Détails

  • (^|\W) - un groupe de capture correspondant à l'un ou l'autre
    • ^ - début de chaîne
    • | - ou 
    • \W - un caractère autre que Word
  • test - un mot
  • ($|\W) - un groupe de capture correspondant à l'un ou l'autre
    • $ - fin de chaîne
    • | - ou 
    • \W - un caractère autre que Word.

Notez que \W correspond à tous les caractères sauf les lettres, les chiffres et _. Si vous souhaitez faire correspondre un mot pouvant apparaître entre _ (caractères de soulignement), vous avez besoin d'un modèle un peu différent:

(^|[^[:alnum:]])test($|[^[:alnum:]])

L'expression de parenthèse refusée [^[:alnum:]] correspond à n'importe quel caractère sauf les caractères alphanumériques et correspond à _; ainsi, _test_ sera associé à ce modèle.

Voir cette démo regex .

1
Wiktor Stribiżew

En général, je m'en tiens à la solution de René, à l'exception des cas où la correspondance doit être nulle. C'est-à-dire que vous ne voulez pas capturer le caractère non-Word au début/à la fin.

Par exemple, si notre chaîne est test test, alors (\b)test(\b) correspondra deux fois, mais (^|\s|\W)test($|\s|\W) ne correspondra qu'à la première occurrence. Du moins, c'est certainement le cas si vous essayez d'utiliser regexp_substr.

Exemple

SELECT regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 1, 'i'), regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 2, 'i') FROM dual;

Résultats

test |NULL 

0
ScottTracy