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

C#/.NET 4.7中带空格的15/16位信用卡号正则掩码实现求助

解决C#/.NET 4.7中15/16位带空格信用卡号的掩码问题

你的核心问题在于现有正则匹配范围不准确,且替换逻辑混淆了字符长度与数字数量,导致掩码结果不符合预期。以下是正确的实现方案:

问题分析

现有代码的两个关键错误:

  1. 正则\b(?:\d[ -]*?){11,15}(?=\d{4}\b)仅匹配卡号的前半段(带分隔符),无法覆盖整个卡号,且匹配范围的数字数量不精准。
  2. 替换时基于匹配字符串的总长度计算X的数量,而非实际数字数量,当卡号包含空格时,会导致X的数量错误,且截取的末尾内容可能包含空格。

正确实现(符合你的示例需求)

该方案会移除卡号中的空格,仅保留最后4位数字,其余数字替换为X:

private static string MaskCreditCardNumber(string input)
{
    // 匹配由空格分隔的15/16位数字(确保前后无其他数字,避免误匹配)
    string pattern = @"(?<!\d)(?:\d\s*){15,16}(?!\d)";
    
    return Regex.Replace(input, pattern, match =>
    {
        // 提取匹配项中的所有数字
        string pureDigits = new string(match.Value.Where(char.IsDigit).ToArray());
        
        // 仅处理15或16位的有效卡号
        if (pureDigits.Length is 15 or 16)
        {
            int maskCount = pureDigits.Length - 4;
            return new string('X', maskCount) + pureDigits.Substring(maskCount);
        }
        
        // 不符合条件则返回原内容
        return match.Value;
    });
}

正则说明

  • (?<!\d):负向零宽断言,确保匹配的卡号前没有其他数字,避免误匹配更长数字串的片段。
  • (?:\d\s*){15,16}:匹配15或16组「数字+任意数量空格」,覆盖所有带空格分隔的15/16位卡号格式。
  • (?!\d):负向零宽断言,确保匹配的卡号后没有其他数字,避免误匹配。

测试验证

  • 输入:"CC# 123456789012345" → 输出:"CC# XXXXXXXXXXX2345"
  • 输入:"Credit Card 123456 7890 123456" → 输出:"Credit Card XXXXXXXXXXXX3456"

可选方案(保留空格位置)

如果需要保留原卡号的空格分隔,仅将对应位置的数字替换为X,可使用以下代码:

private static string MaskCreditCardNumber(string input)
{
    string pattern = @"(?<!\d)(?:\d\s*){15,16}(?!\d)";
    
    return Regex.Replace(input, pattern, match =>
    {
        char[] cardChars = match.Value.ToCharArray();
        string pureDigits = new string(cardChars.Where(char.IsDigit).ToArray());
        
        if (pureDigits.Length is 15 or 16)
        {
            int digitsToMask = pureDigits.Length - 4;
            int digitIndex = 0;
            
            for (int i = 0; i < cardChars.Length; i++)
            {
                if (char.IsDigit(cardChars[i]))
                {
                    if (digitIndex < digitsToMask)
                    {
                        cardChars[i] = 'X';
                    }
                    digitIndex++;
                }
                // 空格保持原样
            }
            
            return new string(cardChars);
        }
        
        return match.Value;
    });
}

该方案处理后,输入"Credit Card 123456 7890 123456"会输出"Credit Card XXXXX XXXX XXXX3456",保留原空格结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:42:51