如何 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 特殊字符的主要内容,如果未能解决你的问题,请参考以下文章