web-dev-qa-db-fra.com

Supprimer des caractères spéciaux d'une chaîne Oracle

À partir d'une base de données Oracle 11g, à l'aide de SQL, je dois supprimer la séquence suivante de caractères spéciaux d'une chaîne, c'est-à-dire.

~!@#$%^&*()_+=\{}[]:”;’<,>./?

Si l'un de ces caractères existe dans une chaîne, à l'exception de ces deux caractères, que je ne veux PAS supprimer, c'est-à-dire: "|" et "-", j'aimerais les supprimer complètement.

Par exemple: 

De: 'ABC(D E+FGH?/IJK LMN~OP' À: 'ABCD EFGHIJK LMNOP' après suppression des caractères spéciaux.

J'ai essayé ce petit test qui fonctionne pour cet échantillon, à savoir:

select regexp_replace('abc+de)fg','\+|\)') from dual

mais y a-t-il un meilleur moyen d'utiliser ma séquence de caractères spéciaux ci-dessus sans utiliser ce modèle de chaîne de '\+|\)' pour chaque caractère spécial utilisant Oracle SQL?

Merci.

4
tonyf

Vous pouvez remplacer autre chose que des lettres et de l'espace par une chaîne vide

[^a-zA-Z ]

voici démo en ligne


Comme ci-dessous commentaires

J'ai toujours besoin de conserver les deux caractères spéciaux suivants dans ma chaîne, c'est-à-dire "|" et "-".

Juste exclure plus

[^a-zA-Z|-]

Remarque: trait d'union - doit figurer au début ou à la fin ou être échappé comme \- car il a une signification particulière dans la classe Character pour définir une plage.

Pour plus d'informations, lisez à propos de Classes de caractères ou jeux de caractères

3
Braj

La regex correspondant à votre séquence de caractères spéciaux est:

[]~!@#$%^&*()_+=\{}[:”;’<,>./?]+
0
Andie2302

Je pense que vous manquez encore d’échapper à tous les caractères spéciaux pour les expressions rationnelles. Pour ce faire, procédez de manière itérative: Créez un test et commencez à construire caractère par caractère votre chaîne d’expression régulière pour voir si cela supprime ce que vous attendez d'être supprimé. Si le dernier personnage ne fonctionne pas, vous devez y échapper. Cela devrait faire l'affaire.

0
user2999951
SELECT TRANSLATE('~!@#$%sdv^&*()_+=\dsv{}[]:”;’<,>dsvsdd./?', '~!@#$%^&*()_+=\{}[]:”;’<,>./?',' ')
FROM dual;

résultat:

TRANSLATE
-------------
 sdvdsvdsvsdd
0
Toolkit

Pensez à utiliser ce remplacement d'expression régulière à la place:

REGEXP_REPLACE('abc+de)fg', '[~!@#$%^&*()_+=\\{}[\]:”;’<,>.\/?]', '')

Le remplacement correspondra à n'importe quel caractère de votre liste.

Voici une démo regex !

0
Unihedron