我有一个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结果。 有人还有其他方法吗?
答案 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'
,表示我们要进行不区分大小写的替换。
上述逻辑从您的文本中删除了文字文本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