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

C#使用Regex.Replace仅替换字符串中16位信用卡号为*的问题

正则替换信用卡号误替换同段其他数字问题修复

需求说明

需要通过正则将字符串中属于信用卡号的16位连续数字替换为*,待处理的原始请求字符串如下:

"Request=Credit Card.Auth Only&Version=4022&HD.Network_Status_Byte=*&HD.Application_ID=TZAHSK!&HD.Terminal_ID=12991kakajsjas&HD.Device_Tag=000123&07.POS_Entry_Capability=1&07.PIN_Entry_Capability=0&07.CAT_Indicator=0&07.Terminal_Type=4&07.Account_Entry_Mode=1&07.Partial_Auth_Indicator=0&07.Account_Card_Number=4242424242424242&07.Account_Expiry=1024&07.Transaction_Amount=142931&07.Association_Token_Indicator=0&17.CVV=200&17.Street_Address=123 Road SW&17.Postal_Zip_Code=90210&17.Invoice_Number=INV19291"

原有实现逻辑:先按.分割字符串,检查每个分段是否同时包含card和number关键词,匹配到卡号分段则将其中的16位卡号替换为*。

原有问题代码

public void MaskData(string input)
{
    if (input.Contains("."))
    {
        string[] userInput = input.Split('.');

        foreach (string uInput in userInput)
        {
            string lowerCaseInput = uInput.ToLower();

            string containsCard = "card";
            string containsNumber = "number";

            if (lowerCaseInput.Contains(containsCard) && lowerCaseInput.Contains(containsNumber))
            {
                tbStoreInput.Text += Regex.Replace(lowerCaseInput, @"[0-9]", "*") + Environment.NewLine;

            }
            else
            {
                tbStoreInput.Text += lowerCaseInput + Environment.NewLine;
            }
        }
    }
}

问题原因

代码中使用的正则[0-9]会匹配所有单个数字,不区分长度和位置,因此会把匹配分段内&符号后的其他短数字也替换为*,最终得到account_card_number=****************&**的错误结果,不符合仅替换16位卡号的需求。另外代码直接将转小写后的内容拼接输出,会丢失原始字符串的大小写格式。

修复方案

  • 正则匹配规则调整:将原来匹配所有单个数字的[0-9]替换为匹配连续16位数字的\d{16},精准命中信用卡号,不会影响同段内其他长度的数字。
  • 逻辑调整:转小写操作仅用于关键词判断,不直接将转小写后的内容拼接输出,保留原始字符串的大小写格式。

修复后的代码如下:

public void MaskData(string input)
{
    if (input.Contains("."))
    {
        string[] userInput = input.Split('.');
        foreach (string uInput in userInput)
        {
            // 仅用转小写后的内容做关键词匹配,不修改原始内容
            string lowerCaseInput = uInput.ToLower();
            if (lowerCaseInput.Contains("card") && lowerCaseInput.Contains("number"))
            {
                // 仅替换连续16位数字为对应数量的*,其余内容完全保留
                string maskedSegment = Regex.Replace(uInput, @"\d{16}", new string('*', 16));
                tbStoreInput.Text += maskedSegment + Environment.NewLine;
            }
            else
            {
                tbStoreInput.Text += uInput + Environment.NewLine;
            }
        }
    }
}

可选优化

如果需要避免其他位置刚好出现16位数字导致误替换,可以将正则修改为绑定键名的匹配规则:(?<=Account_Card_Number=)\d{16},该规则只会匹配Account_Card_Number=字段后紧跟的16位数字,匹配精度更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:30:45