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

如何在SQL中移除字符串中与首字符相同的所有字符(不区分大小写)

移除字符串中所有与首字符相同的字符(不区分大小写)

问题场景

需要处理数据表中的字符串,移除所有和首字符相同的字符(不区分大小写),示例如下:

uJnMus onsyk uyT Uaszs -> JnMs onsyk yT aszs
@uJnMus o@nsyk uyT Ua@szs -> uJnMus onsyk uyT Uaszs

之前的写法需要手动指定首字符,完全不通用:

SELECT regexp_replace(content, '^u|u', '', 'ig')
FROM string;

SELECT regexp_replace(content, '^@|@', '', 'ig')
FROM string;

尝试用捕获组做通用匹配,但结果只移除了首字符,不符合预期:

SELECT regexp_replace(content, '^(.)|\1', '', 'ig')
FROM string;

解决方案

方法一:修正正则表达式

你之前的问题在于,\1默认只会严格匹配捕获组的字符,不会自动适配大小写。加上局部不区分大小写标记(?i)就能解决这个问题,同时注意全局替换的参数:

SELECT regexp_replace(content, '^(.)|(?i)\1', '', 'g')
FROM string;

说明:

  • ^(.):捕获字符串的第一个字符,存入分组1
  • (?i)\1:启用局部不区分大小写模式,匹配分组1字符的任意大小写形式
  • 'g':全局替换所有匹配项(这里不用'ig',避免全局大小写不敏感影响首字符的捕获逻辑)

如果你的SQL方言不支持(?i)局部模式,可以用字符类拼接的方式:

SELECT regexp_replace(
    content, 
    '^(.)|[' || lower(substr(content, 1, 1)) || upper(substr(content, 1, 1)) || ']', 
    '', 
    'g'
) FROM string;

方法二:分步替换(更直观)

如果正则逻辑绕不清,直接提取首字符的大小写形式,拼成字符类做全局替换:

SELECT 
  regexp_replace(
    content, 
    '[' || lower(left(content, 1)) || upper(left(content, 1)) || ']', 
    '', 
    'g'
  ) AS cleaned_content
FROM string;

这个逻辑很简单:先取首字符的小写和大写版本,组成匹配所有大小写变体的字符类,然后一次性替换掉所有符合条件的字符。

内容的提问来源于stack exchange,提问作者Meliodas Dragon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:43:23