You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

正则逻辑说明

  1. (\W|^):匹配单词前的非单词字符(如空格)或字符串开头,替代Oracle不支持的\b;
  2. ([A-Z])\2{2,49}:捕获单个大写字母,后续字符必须与该字母完全重复(\2是反向引用捕获的字母),重复2-49次(整体单词长度3-50,符合你的需求范围);
  3. (\W|$):匹配单词后的非单词字符(如空格)或字符串结尾;
  4. 内层REGEXP_REPLACE:移除纯重复字母单词,保留前后的分隔符;
  5. 外层REGEXP_REPLACE:将替换后出现的多个连续空格合并为单个;
  6. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:26:06