Est-il possible d'échapper à un ensemble de caractères avec une expression régulière.
Un exemple:
SELECT regexp_replace('name!surname?', '[^a-zA-Z\d\s:]', '#') from sys.dual;
L'idée est d'échapper à tous les caractères non alphanumériques, je sais comment écrire une expression régulière pour les trouver mais vraiment avoir du mal à s'échapper.
Utilisation du SQL d'Oracle avec REGEXP_REPLACE()
:
Input: name!surname Output: name\!surname
Le résultat ressemblerait à nom # nom de famille #
mais j'aimerais savoir s'il est possible d'obtenir quelque chose comme nom \! Nom de famille \?
.
J'ai besoin d'échapper à tous les caractères non alphanumériques pour Oracle Text pour analyser une requête.
Je ne peux pas utiliser {} pour l'échappement multiple car il ne fonctionne pas avec le caractère générique%.
3 Réponses :
Vous pouvez utiliser une double barre oblique inverse avant \ 1
comme troisième argument, avec [^ [: alnum:]]
posix (le [: espace: ]
posix juste avant le crochet fermant et les parenthèses doit supprimer la barre oblique inverse en remplaçant par des espaces):
select regexp_replace('name!surname','([^[:alnum:][:space:]])','\\\1') from dual
Comment exclure {}
de l'expression régulière?
si vous voulez extraire nom \ {} nom
en conséquence, ajouter une accolade fermante }
après [: space:]
posix tel que '([^ [: alnum:] [: space:]}])'
devrait suffire @ dmak2709
Enveloppez le groupe de caractères que vous essayez de faire correspondre dans un groupe de capture, puis utilisez \\\ 1
comme remplacement. \\
est une barre oblique inverse et \ 1
insérera le contenu du premier groupe de capture:
| REPLACEMENT | | :-------------- | | name\!surname\? |
Sorties:
SELECT regexp_replace('name! surname?', '([^a-zA-Z0-9[:space:]:])', '\\\1') AS replacement from sys.dual;
db fiddle ici
Utiliser
SELECT REGEXP_REPLACE('name!surname','([[:punct:]])','\\\1') from dual
Voir la démo en ligne , résultat: p>
Le modèle est ([[: punct:]])
, un groupe de capture unique qui correspond un seul caractère de ponctuation ou de symbole. Le remplacement est une barre oblique inverse + la valeur du groupe.
Notez que \
dans le modèle de remplacement est un caractère spécial, il est utilisé pour introduire des espaces réservés , références arrière de remplacement , par conséquent, il doit être échappé lui-même pour produire une barre oblique inverse littérale dans la chaîne résultante.
Fait. Vérifier. :RÉ