Oracle正则表达式处理字符串:REGEXP_REPLACE失效求正则解决方案
解决Oracle REGEXP_REPLACE无法转换目标字符串的问题
你的问题出在正则表达式的匹配逻辑完全不符合需求,先拆解下为什么原来的正则没效果:
你用的([^,]+)(\1)+是用来匹配连续重复的非逗号字符串(比如abcabc这种重复片段),但你的输入里每个SEPAx后面都是独特的日期部分,根本没有重复的非逗号组,所以这个正则找不到任何匹配项,自然替换后字符串毫无变化。
下面给你两个纯正则的解决方案,都不需要用CONNECT BY LEVEL拆分:
方案一:替换后清理末尾逗号(更直观)
这个方案先全局替换每个SEPAx,日期;单元为SEPAx,,再用RTRIM去掉最后多余的逗号:
SELECT RTRIM( REGEXP_REPLACE( 'SEPA1,30-NOV-17;SEPA2,30-NOV-17;SEPA3,30-NOV-17;', '(SEPA\d+),[^;]+;', '\1,' ), ',' ) AS cleaned_result FROM dual;
正则逻辑说明:
(SEPA\d+):捕获你需要保留的SEPA加数字的部分(比如SEPA1),[^;]+;:匹配逗号、随后的所有非分号字符(也就是日期部分)、最后匹配分号- 全局替换后会得到
SEPA1,SEPA2,SEPA3,,再用RTRIM(',')去掉末尾的逗号就得到目标结果。
方案二:单正则一次性处理(更简洁)
利用Oracle正则的负向预查,直接匹配并替换所有不需要的内容,同时处理末尾逗号:
SELECT REGEXP_REPLACE( 'SEPA1,30-NOV-17;SEPA2,30-NOV-17;SEPA3,30-NOV-17;', '(SEPA\d+),[^;]+;(?!$)|,$', '\1' ) AS cleaned_result FROM dual;
正则逻辑说明:
(SEPA\d+),[^;]+;(?!$):匹配所有非末尾的SEPAx,日期;单元((?!$)确保不是字符串最后一个单元),捕获SEPAx|,$:同时匹配字符串末尾的逗号- 替换时,第一个分支替换为捕获的
SEPAx,第二个分支替换为空,直接得到SEPA1,SEPA2,SEPA3
这两个方案都能完美满足你的需求,测试后结果都是正确的。
内容的提问来源于stack exchange,提问作者Arun GoWdA
相关产品推荐
相关产品推荐

