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

如何用regexp_replace实现字符串首尾保留2位中间掩码?

字符串掩码:首尾各留2字符,其余替换为*

需求明确:处理字符串时保留开头2个、结尾2个字符,中间所有字符换成*。比如输入A9999999999,要得到A9********99。

你之前试的几个正则写法都没命中要点,问题出在:

  • regexp_replace(a, '[0-9]', '*') as a:把所有数字全换成*,完全没保留首尾字符,方向错了;
  • REGEXP_REPLACE(a, '[0-9]', '*', 6) as a:从第6位开始替换数字,但没针对性保留首尾的2个字符,逻辑不对;
  • REGEXP_REPLACE(a, '\1((.*)\4$)', '\1*******\3') as a:正则语法错误,捕获组的定义和引用都不规范,根本匹配不到目标内容。

正确实现方式

方案1:用字符串函数(更简单通用)

大部分SQL方言都支持LEFT、RIGHT、REPEAT这类函数,直接拼接更直观:

-- MySQL/PostgreSQL通用,Oracle可替换REPEAT为RPAD('*', LENGTH(a)-4, '*')
SELECT CONCAT(LEFT(a, 2), REPEAT('*', LENGTH(a) - 4), RIGHT(a, 2)) AS masked_a;
  • LEFT(a,2)取开头2个字符;
  • REPEAT('*', LENGTH(a)-4)生成和中间长度一致的*(原长度减4,因为首尾各留2个);
  • RIGHT(a,2)取结尾2个字符;
  • 最后用CONCAT拼接三部分。

方案2:用正则表达式(适合必须用正则的场景)

如果一定要用REGEXP_REPLACE,可以通过捕获首尾字符组,再动态生成对应数量的*:

-- PostgreSQL示例
SELECT REGEXP_REPLACE(a, '^(.{2})(.*)(.{2})$', '\1' || REPEAT('*', LENGTH(a)-4) || '\3') AS masked_a;
  • ^(.{2})捕获开头2个字符;
  • (.{2})$捕获结尾2个字符;
  • 中间用REPEAT生成对应长度的*,再和首尾捕获组拼接。

兼容短字符串的写法

如果字符串长度小于等于4(比如长度为3或4),需要加判断避免出现负数长度:

SELECT 
  CASE 
    WHEN LENGTH(a) <= 4 THEN a
    ELSE CONCAT(LEFT(a,2), REPEAT('*', LENGTH(a)-4), RIGHT(a,2))
  END AS masked_a;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:38:18