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?
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 ).
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 Wordtest
- 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 .
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