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

