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









暂无评论内容