信用卡号掩码处理时含前后空格的误判问题排查与修正
解决信用卡号掩码时的误匹配问题
问题根源
原正则表达式将空格、连字符这类分隔符计入了卡号长度统计,导致像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
相关产品推荐
相关产品推荐

