comment échapper expression régulière caractères dans oracle?
Comment échapper les caractères spéciaux de modèle d'expression régulière dans Oracle?
Par exemple, j'ai besoin d'une fonction qui traslates
some.string[with(special)reg-exp]characters
à
some\.string\[with\(special\)reg\-exp\]characters
.
En PHP je voudrais utiliser preg_escape(). Est-il Oracle de contrepartie?
Pourquoi je fais cela?
Je suis en train d'écrire une fonction pl/sql qui vérifie si un string
est sur le list,of,string,elements
.
Voici mon code:
CREATE OR REPLACE
FUNCTION list_contains(needle_ IN VARCHAR2,
haystack_ IN VARCHAR2,
separator_ IN VARCHAR2 DEFAULT ',')
RETURN INTEGER
IS
BEGIN
IF regexp_like(haystack_, '(^|' || separator_ || ')' || needle_ || '(' || separator_ || '|$)') THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END list_contains;
La fonction essentiellement de travaux:
list_conains('eve','john,eve,maria,steve') => 1
Le problème, c'est quand j'essaie de l'appeler avec des valeurs étranges de needle_
ou separator_
, comme .
ou d'autres chaînes de caractères qui ont une signification spéciale dans les expressions régulières.
list_conains('eve','jean.maria.steve','.') => 1
Comme vous le voyez, il n'y a pas de veille sur la liste, mais la .
correspond à la t
lettre du nom de steve, alors la fonction renvoie incorrectement 1
.
Je sais que je peux remplacer les points manuellement, mais il ya encore beaucoup d'autres regex caractères spéciaux qui vont interférer et je préfère ne pas essayer de faire la liste de tous les caractères de moi-même.
Comment échapper à la needle_ et separator_?
Vous devez vous connecter pour publier un commentaire.
Si je comprends votre question correctement, vous n'avez pas besoin d'expressions régulières pour cela. Vous pouvez utiliser une simple COMME.
Edit: Si
%
ou_
lui-même est le separator_, alors il est nécessaire de leur échapper.IF separator_ || haystack_ || separator_ LIKE '%' || REPLACE(REPLACE(REPLACE(separator_ || needle_ || separator_, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\' THEN
... Je n'ai qu'à s'assurer que les deux needle_ et separator_ est échappé en toute sécurité. J'ai eu aussi s'échapper le caractère d'échappement, afin d'être sûr que si needle_ il contient, il ne sera pas traitée d'une manière particulière.Les caractères suivants doivent être échappés: \ ^ . $ | ( ) [ ] * + ? { } ,
http://psoug.org/snippet/Regular-Expressions--Regexp-Cheat-Sheet_856.htm
Je pense qu'il serait plus facile de simplement échapper le séparateur dans la regexp déclaration. Essayez cela, il semblait fonctionner pour moi:
Tous j'ai changé, c'est la barre oblique devant les séparateurs dans votre chaîne de construction.
Essayez ceci:
J'ai fait de la casse avec une baisse de la fonction. Si vous le vouliez, vous pourriez également couper des espaces blancs:
lower(trim(needle_)) = lower(trim(haystack_ary.val))
Cela peut être fait sans aucune expression régulière et s'échappe par instr fonction, qui return 0 si aucune correspondance et > 0 si match.
Pour que cela fonctionne, vous devez ajouter le separator_ au début et à la fin de needle_ et haystack_ avant de vérifier si le haystack_ contient needle_.
Preuve de concept
résultat: