从PLSQL字符串替换多个CHR()

时间:2018-08-17 06:46:45

标签: oracle plsql

我有一个PLSQL字符串,其中包含chr()特殊字符,如chr(10),chr(13)。我想从字符串中替换这些特殊字符。我尝试了以下方法

select  regexp_replace('Hello chr(10)Goodchr(13)Morning','CHR(10)|chr(13)','') from dual;

这不起作用,因为regexp_replace不替换chr()函数。然后我尝试了

select translate('Hello chr(10)Goodchr(13)Morning', 'chr(10)'||'chr(13)', ' ') from dual;

它部分起作用,即;我被迫用空白(第三个参数)替换chr()。如果我不想用空格替换chr(),则没有选择。如果我将第三个字符作为null传递,则上述查询将返回null结果。 有人还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

替换的问题不是逻辑,而是语法。括号是正则表达式的元字符,因此,如果要替换文字括号,则需要对其进行转义。所以你的模式应该是这样:

chr\(13\)|chr\(10\)

这是一个有效的查询:

select
    regexp_replace('Hello chr(10)Goodchr(13)Morning','chr\(13\)|chr\(10\)','', 1, 0, 'i')
from dual

上面对regexp_replace的调用中的第五个参数是'i',表示我们要进行不区分大小写的替换。

Demo

上述逻辑从您的文本中删除了文字文本chr(13)chr(10)。相反,如果您要删除实际的控制字符chr(13)chr(10),则可以将这些控制字符添加到替换中,例如

select
    regexp_replace('Hello chr(10)Goodchr(13)Morning','chr\(13\)|chr\(10\)|chr(10)|chr(13)','', 1, 0, 'i')
from dual

答案 1 :(得分:1)

由于正则表达式函数在Oracle中相对昂贵,我认为值得展示一下仅使用REPLACE来达到相同效果的替代方法。 这会用空格替换每个控制字符的出现;

SELECT REPLACE(REPLACE('ABC'||CHR(10)||'DEF'||CHR(13)||'GHI'||CHR(10)||'JKL',CHR(13),' '),CHR(10),' ') from dual

这将替换出现的字符串'CHR(13)'和'CHR(10)';

select REPLACE(REPLACE('ABCCHR(10)DEFCHR(13)GHICHR(10)JKL','CHR(13)',' '),'CHR(10)',' ') from dual