Oracle 正则替换数据 regexp_replace 函数详解与示例

regexp_replace 是一个‌基于正则表达式做字符串替换的函数‌,可以理解成高级版的 replace。‌‌replace 只能找固定的字面值(比如把 "年" 换成空),而 regexp_replace 可以按模式/规则去匹配并替换(比如"把所有不是数字的字符全部删掉")。

regexp_replace 在 Oracle 数据库中是内置的字符串函数(Oracle 10g 起就支持),属于正则表达式函数族(regexp_replace / regexp_substr / regexp_instr / regexp_like)中的一员。它用正则表达式去匹配文本里符合规则的部分,再替换成指定内容,适合处理批量清洗、格式化、脱敏这类 replace 搞不定的复杂场景。‌‌

基本语法

regexp_replace 在不同数据库的写法略有差异,但核心结构差不多:‌‌

regexp_replace( source_char,        -- 要处理的原字符串
               pattern,             -- 正则表达式(匹配规则)
               [replace_string],    -- 替换成什么(默认 '' 即删除)
               [position],          -- 从第几个字符开始找(默认 1)
               [occurrence],        -- 替换第几次匹配(0=全部,默认 0)
               [match_modifier] )   -- 修饰符:i/c/m/n 等

‌前3个参数‌是必填的,后面的都按需使用。不传“替换次数”时默认替换所有匹配项,设为 1 就只替换第一次出现的。‌‌

replace 和 regexp_replace 的对比

需求
replace 写法
regexp_replace 写法
删掉"年""月""日"三个字
replace(replace(replace(s,'年',''),'月',''),'日','')
regexp_replace(s, '[年月日]', '')
删掉所有非数字​
❌ 写不出来
regexp_replace(s, '[^0-9]', '')
把任意分隔符统一改斜杠
❌ 要嵌套一堆
regexp_replace(s, '[^0-9]+', '/')
yyyy-mm-dd 重排成 dd/mm/yyyy
❌ 做不到
regexp_replace(s, '(\d{4})-(\d{2})-(\d{2})', '\3/\2/\1')

示例

1、删掉所有非数字

select regexp_replace('2026年08月14日', '[^0-9]', '') from dual;
-- 结果:20260814

2、删掉所有字母

select regexp_replace('AB123cd', '[a-zA-Z]', '') from dual;
-- 结果:123

3、把连续空白压成单个空格

select regexp_replace('A   B    C', '[[:space:]]+', ' ') from dual;
-- 结果:a b c

4、只替换第 1 处匹配(occurrence=1)

select regexp_replace('a-a-a', '-', '|', 1, 1) from dual;
-- 结果:a|a-a

5、忽略大小写替换

select regexp_replace('Oracle', 'ORACLE', 'PG', 1, 0, 'i') from dual;
-- 结果:pg

注意事项

1、正则语法是 POSIX 风格,不是 Perl/Java 的 \d,Oracle 里要写 [0-9][[:digit:]]
2、分组反向引用用 \1 \2 \3,不是 $1 $2
3、如果正则写错(比如括号不配对),会直接报 ORA-12728 / ORA-12729 之类,不会静默失败
4、对大表批量 UPDATE 时,正则比纯 replace 吃 CPU,能确定格式就优先 replace

© 版权声明
THE END
如果觉得这篇文章对您有帮助,可以收藏本网址,方便下次访问!
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容