从Oracle字符串中删除特殊字符

问题描述 投票:5回答:6

在Oracle 11g数据库中,使用SQL,我需要从字符串中删除以下特殊字符序列,即

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

如果字符串中存在任何这些字符,除了这两个字符,我不想删除它们,即:"|""-"然后我希望它们被完全删除。

例如:

来自:'ABC(D E+FGH?/IJK LMN~OP' To:'ABCD EFGHIJK LMNOP'删除特殊字符后。

我试过这个小样本,适用于这个样本,即:

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

但有没有更好的方法来使用我的上述特殊字符序列而不使用Oracle SQL为每个特殊字符执行'\+|\)'的字符串模式?

sql regex oracle11g
6个回答
5
投票

您可以用空字符串替换字母和空格以外的任何内容

[^a-zA-Z ]

这是online demo


根据以下评论

我仍然需要在我的字符串中保留以下两个特殊字符,即“|”和“ - ”。

只需排除更多

[^a-zA-Z|-]

注意:连字符-应该在开头或结尾处或像\-一样进行转义,因为它在Character类中具有特殊含义来定义范围。

有关Character Classes or Character Sets的更多信息,请参阅


0
投票

请考虑使用此正则表达式替换:

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

替换将匹配列表中的任何字符。

这是一个regex demo


0
投票

匹配您的特殊字符序列的正则表达式是:

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

0
投票

我觉得你仍然错过了逃避所有正则表达式的特殊角色。要实现这一点,请反复进行:构建测试文件并开始按字符构建正则表达式字符串,以查看它是否删除了您希望删除的内容。如果最新的角色不起作用,你必须逃避它。这应该够了吧。


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

结果:

TRANSLATE
-------------
 sdvdsvdsvsdd

-1
投票
SQL> select translate('abc+de@fg-hq!m', 'a+-@!', etc.) from dual;

TRANSLATE(
----------
abcdefghqm
© www.soinside.com 2019 - 2024. All rights reserved.