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

6tqwzwtp  于 2023-03-31  发布在  Oracle
关注(0)|答案(7)|浏览(299)

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

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

如果这些字符中的任何一个存在于字符串中,除了这两个字符,我不想删除,即:"|""-"那么我想他们完全删除。
例如:
从:'ABC(D E+FGH?/IJK LMN~OP'到:删除特殊字符后的'ABCD EFGHIJK LMNOP'
我已经尝试了这个小测试,适用于这个样本,即:

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

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

mtb9vblg

mtb9vblg1#

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

[^a-zA-Z ]

这里是online demo
根据以下评论
我仍然需要在字符串中保留以下两个特殊字符,即“|”和“-”。
只是排除更多

[^a-zA-Z|-]

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

有关更多信息,请阅读about Character Classes or Character Sets

f3temu5u

f3temu5u2#

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

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

替换将匹配列表中的任何字符。
这里有一个regex demo

x4shl7ld

x4shl7ld3#

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

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

osh3o9ms4#

我觉得你仍然没有转义所有regex特殊字符。要实现这一点,请迭代:构建一个test-tring并开始逐字符构建regex-string,看看它是否删除了你期望删除的字符。如果最新的字符不起作用,你必须转义它。这应该可以做到。

yeotifhr

yeotifhr5#

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

结果:

TRANSLATE
-------------
 sdvdsvdsvsdd
eufgjt7s

eufgjt7s6#

您可以使用以下命令:regexp_replace('ABC(D E+FGH?/IJK LMN~ OP','\W')
这种类型的输入在regexp_replace函数中,很容易被'\W'值修改。而且'\w'的输入值可以保留特殊字符并删除(或替换)所有字母字符。

ovfsdjhp

ovfsdjhp7#

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

TRANSLATE(
----------
abcdefghqm

相关问题