Oracle 19c正则表达式问题:替换纯重复字母单词为空格
Oracle 19c 替换纯重复字母单词为空格的解决方案
问题核心
你需要移除字符串中由同一个字母重复组成的单词(如AAAA、XXXX),但之前的正则表达式错误匹配了任意长度3+的大写字母单词,且Oracle 19c不支持\b单词边界语法,导致需求未达成。
正确实现方案
使用反向引用匹配纯重复字母的单词,结合(\W|^)/(\W|$)模拟单词边界,再处理替换后可能出现的多余空格:
SELECT TRIM( REGEXP_REPLACE( REGEXP_REPLACE( 'AAAA TEST CDDDD TEST', '(\W|^)([A-Z])\2{2,49}(\W|$)', '\1\3' ), '\s+', ' ' ) ) AS result FROM dual;
正则逻辑说明
(\W|^):匹配单词前的非单词字符(如空格)或字符串开头,替代Oracle不支持的\b;([A-Z])\2{2,49}:捕获单个大写字母,后续字符必须与该字母完全重复(\2是反向引用捕获的字母),重复2-49次(整体单词长度3-50,符合你的需求范围);(\W|$):匹配单词后的非单词字符(如空格)或字符串结尾;- 内层
REGEXP_REPLACE:移除纯重复字母单词,保留前后的分隔符; - 外层
REGEXP_REPLACE:将替换后出现的多个连续空格合并为单个; TRIM:去除字符串首尾的多余空格。
测试验证
- 输入:
'AAAA TEST CDDDD TEST'→ 输出:'TEST CDDDD TEST' - 输入:
'BAD GHHHH TEST XXXX'→ 输出:'BAD GHHHH TEST' - 输入:
'BAD AAAAA FOR ABBBB'→ 输出:'BAD FOR ABBBB'(ABBBB含不同字母,不会被替换)
你之前的写法问题
- 原正则
(\W|^)([A-Z]{3,50})(\W|$)匹配的是任意3-50个大写字母的单词,而非仅重复字母的单词,会误删FOR这类正常单词; - 使用
\b不符合Oracle正则语法,必须用(\W|^)/(\W|$)替代单词边界。
内容的提问来源于stack exchange,提问作者jaykay007
相关产品推荐
相关产品推荐

