在Oracle 11g数据库中,使用SQL,我需要从字符串中删除以下特殊字符序列,即
~!@#$%^&*()_+=\{}[]:”;’<,>./?
如果字符串中存在任何这些字符,除了这两个字符,我不想删除它们,即:"|"
和"-"
然后我希望它们被完全删除。
例如:
来自:'ABC(D E+FGH?/IJK LMN~OP'
To:'ABCD EFGHIJK LMNOP'
删除特殊字符后。
我试过这个小样本,适用于这个样本,即:
select regexp_replace('abc+de)fg','\+|\)') from dual
但有没有更好的方法来使用我的上述特殊字符序列而不使用Oracle SQL为每个特殊字符执行'\+|\)'
的字符串模式?
您可以用空字符串替换字母和空格以外的任何内容
[^a-zA-Z ]
根据以下评论
我仍然需要在我的字符串中保留以下两个特殊字符,即“|”和“ - ”。
只需排除更多
[^a-zA-Z|-]
注意:连字符-
应该在开头或结尾处或像\-
一样进行转义,因为它在Character类中具有特殊含义来定义范围。
有关Character Classes or Character Sets的更多信息,请参阅
请考虑使用此正则表达式替换:
REGEXP_REPLACE('abc+de)fg', '[~!@#$%^&*()_+=\\{}[\]:”;’<,>.\/?]', '')
替换将匹配列表中的任何字符。
这是一个regex demo!
匹配您的特殊字符序列的正则表达式是:
[]~!@#$%^&*()_+=\{}[:”;’<,>./?]+
我觉得你仍然错过了逃避所有正则表达式的特殊角色。要实现这一点,请反复进行:构建测试文件并开始按字符构建正则表达式字符串,以查看它是否删除了您希望删除的内容。如果最新的角色不起作用,你必须逃避它。这应该够了吧。
SELECT TRANSLATE('~!@#$%sdv^&*()_+=\dsv{}[]:”;’<,>dsvsdd./?', '~!@#$%^&*()_+=\{}[]:”;’<,>./?',' ')
FROM dual;
结果:
TRANSLATE
-------------
sdvdsvdsvsdd
SQL> select translate('abc+de@fg-hq!m', 'a+-@!', etc.) from dual;
TRANSLATE(
----------
abcdefghqm