如何 REGEXP_REPLACE 特殊字符

Posted

技术标签:

【中文标题】如何 REGEXP_REPLACE 特殊字符【英文标题】:How to REGEXP_REPLACE special character 【发布时间】:2015-01-16 22:12:14 【问题描述】:

我在使用正则表达式时遇到问题

select REGEXP_REPLACE(declinereasondesc, '(.+)(£)(\d+)', '\1\3 (GBP)') as r from DECLINEREASON t

它与后面的行不匹配

Too expensive : By less than £100
Too expensive : By more than £200

预期结果

Too expensive : By less than 100 (GBP)
Too expensive : By more than 200 (GBP)

编辑:

非信徒截图

【问题讨论】:

在这里工作regex101.com/r/lZ5mN8/34 你得到的输出是什么?你的正则表达式适合我 @arunb2w 它与行不匹配,所以没有任何变化 (Too expensive : By less than £100) @vks 我知道regex101.com/r/dZ1vT6/10#pcre 在 oracle 中不起作用。 @LIUFA - 在这里工作正常 select REGEXP_REPLACE('太贵了:不到 100 英镑', '(.+)(£)(\d+)', '\1 \3 (GBP)') as r from dual; 我认为你的源字符串不是你所期望的 【参考方案1】:

我自己发现问题是£,我相信每个人都怀疑

解决方案包含两个步骤,首先是获取符号代码,即使您将£ 复制粘贴到select ascii() from dual 中它也不会飞。您必须选择如下符号才能获得正确的代码。

select ascii(substr(declinereasondesc, 30,1)) from DECLINEREASON t
where declinereasonid = 7;

就我而言,它给了49827

然后

select REGEXP_REPLACE(declinereasondesc, '(.+)('||chr(49827)||')(\d+)', '\1\3 (GBP)') from DECLINEREASON t;

只有这样它才能工作。

【讨论】:

你的数据库中的 oracle 字符集是什么?我认为这是由于你的数据库中的 NLS_CHARACTERSET 参数 @arunb2w 可能是SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' ; 给我ORA-00942: table or view does not exist 。所以无法确认。 你能试试这个select * from v$nls_parameters where parameter in ('NLS_CHARACTERSET','NLS_LANGUAGE'); 很高兴您解决了您的问题。但是英镑的ascii值是163。我建议你改变你的字符集以避免将来出现这类问题。 ASCII 参考 :: ascii-code.com @arunb2w 如果我能... :)

以上是关于如何 REGEXP_REPLACE 特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

hive替换文件中特殊字符

删除/替换特殊字符,例外

如何替换除-(破折号)以外的特殊字符

如何替换 hive 列中的特殊字符?

如何从postgresql中的字符串中删除特殊字符

如何去除文件名中的特殊字符