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

信用卡号掩码处理时含前后空格的误判问题排查与修正

解决信用卡号掩码时的误匹配问题

问题根源

原正则表达式将空格、连字符这类分隔符计入了卡号长度统计,导致像2420852290这类仅10位的数字串,若周围有空格,会被错误判定为符合12-19位的信用卡号规则,进而被掩码。

修复方案

调整正则逻辑:先定位有效数字数量在12-19位的卡号段(忽略中间的空格、连字符),再仅对段内除最后4位数字外的部分进行掩码,同时保留原有的分隔符结构。

修改后的C#扩展方法如下:

using System.Text.RegularExpressions;

public static class StringExtensions
{
    public static string MaskNewCCNo(this string value)
    {
        // 匹配有效数字12-19位的卡号段,仅掩码最后4位以外的数字
        return Regex.Replace(value, @"\b(?:[\d\s-]*?)(\d)(?=(?:(?:[^\d]*\d){4})[^\d]*\b)(?=(?:[^\d]*\d){12,19}[^\d]*\b)", "x");
    }
}

正则逻辑说明

  • \b:匹配单词边界,避免对数字串的部分片段误匹配
  • (?:[\d\s-]*?):非捕获组,匹配卡号开头的数字、空格或连字符(非贪婪模式,避免过度匹配)
  • (\d):捕获需要替换为x的单个数字
  • (?=(?:(?:[^\d]*\d){4})[^\d]*\b):正向预查,确保当前位置之后还有至少4个数字(保留最后4位不掩码)
  • (?=(?:[^\d]*\d){12,19}[^\d]*\b):正向预查,确保整个卡号段的有效数字总数在12-19位之间

验证效果

  • 对于输入from INV 2420852290 to SAV 0165487:两个数字串有效数字数分别为10和7,不满足规则,不会被掩码
  • 对于合法卡号4111-1111 1111 1111(16位有效数字):会被掩码为xxxx-xxxx xxxx 1111,保留最后4位数字和原有分隔结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:52:07