如何在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
相关产品推荐
相关产品推荐

