如何在.net中屏蔽信用卡号的前6位和后4位

Posted

技术标签:

【中文标题】如何在.net中屏蔽信用卡号的前6位和后4位【英文标题】:How to mask first 6 and last 4 digits for a credit card number in .net 【发布时间】:2019-07-15 18:15:12 【问题描述】:

我对正则表达式非常陌生,我正在尝试使用正则表达式将一个信用卡号转换为 492900******2222 之类的内容,该信用卡号将成为对话的一部分

由于它可能来自任何对话,它旁边可能包含字符串或格式不一致,因此基本上以下所有内容都应格式化为上面的示例:

你好,我的号码是492900001111222 号码是4929000011112222好吗? 4929 0000 1111 2222 4929-0000-1111-2222

它必须是一个正则表达式,用于提取捕获组,然后我将能够使用 MatchEvaluator 将不是前 6 位和后 4 位的所有数字(不包括非数字)转换为 *

我在这里看到了很多关于 php 和 JS 堆栈溢出的示例,但没有一个可以帮助我解决这个问题。

任何指导将不胜感激

更新

我需要扩展一个现有的实现,它使用 MatchEvaluator 来屏蔽不是前 6 个或后 4 个字符的每个字符,理想情况下我不想更改 MatchEvaluator,只是根据正则表达式使屏蔽变得灵活,看这个例如https://dotnetfiddle.net/J2LCo0

更新 2

@Matt.G 和 @CAustin 的答案确实解决了我的要求,但我遇到了另一个障碍,我不能让它如此严格。最终捕获的组只需要考虑数字,因此保持输入文本的格式。 比如:

如果我的卡号中的某些类型是 99 9988 8877776666,那么评估的输出应该是 99 9988 ******666666

或 我的卡号是 9999-8888-7777-6666 它应该输出 9999-88**-****-6666。

这可能吗?

更改了列表以包含我的单元测试中的项目https://dotnetfiddle.net/tU6mxQ

【问题讨论】:

到目前为止你尝试了什么? 模式要求是什么? 【参考方案1】:

尝试正则表达式:(?<=\d4\d2)\d2\d4(?=\d4)|(?<=\d4( |-)\d2)\d2\1\d4(?=\1\d4)

Regex Demo

C# Demo

解释:

2 alternative regexes
(?<=\d4\d2)\d2\d4(?=\d4) - to handle cardnumbers without any separators (- or <space>)
(?<=\d4( |-)\d2)\d2\1\d4(?=\1\d4) - to handle cardnumbers with separator (- or <space>)

1st Alternative (?<=\d4\d2)\d2\d4(?=\d4)
    Positive Lookbehind (?<=\d4\d2) - matches text that has 6 digits immediately behind it
    \d2 matches a digit (equal to [0-9])
        2 Quantifier — Matches exactly 2 times
    \d4 matches a digit (equal to [0-9])
        4 Quantifier — Matches exactly 4 times
    Positive Lookahead (?=\d4) - matches text that is followed immediately by 4 digits
        Assert that the Regex below matches
            \d4 matches a digit (equal to [0-9])
            4 Quantifier — Matches exactly 4 times

2nd Alternative (?<=\d4( |-)\d2)\d2\1\d4(?=\1\d4)

    Positive Lookbehind (?<=\d4( |-)\d2) - matches text that has (4 digits followed by a separator followed by 2 digits) immediately behind it
    1st Capturing Group ( |-) - get the separator as a capturing group, this is to check the next occurence of the separator using \1
    \1 matches the same text as most recently matched by the 1st capturing group (separator, in this case)
    Positive Lookahead (?=\1\d4) - matches text that is followed by separator and 4 digits

【讨论】:

为什么是(?: |-) 而不仅仅是[ -]??此外,您不需要捕获将被覆盖的部分。 感谢您的回答,即使它提供信用卡号码,我也必须使用 MatchEvaluator,因为我实际上是在扩展现有解决方案。这个 sn-p 是我想要做的:dotnetfiddle.net/J2LCo0。我想我只是对正则表达式有误解,我需要正则表达式只匹配需要屏蔽的数字部分。 @Bynho,我已经根据您的新要求更新了答案 请注意\d4(?&lt;=\d4) = \d4 太棒了,谢谢@Matt.G。你能解释一下它是如何工作的吗?【参考方案2】:

如果性能是一个问题,这里的模式只经过 94 步,而不是其他答案的 473 步,通过避免环顾和交替:

\d4[ -]?\d2\K\d2[ -]?\d4

演示:https://regex101.com/r/0XMluq/4

编辑:在 C# 的正则表达式风格中,可以改用以下模式,因为 C# 允许可变长度向后查找。

(?&lt;=\d4[ -]?\d2)\d2[ -]?\d4

Demo

【讨论】:

C# (.NET) 正则表达式不支持\K 构造

以上是关于如何在.net中屏蔽信用卡号的前6位和后4位的主要内容,如果未能解决你的问题,请参考以下文章

如何屏蔽信用卡号的前两个字母和后四个字母[关闭]

如何将信用卡数据保存在数据库中?

在 SQL Server 中屏蔽信用卡号

使用 PySpark 屏蔽信用卡号

如何在 swift 中部分屏蔽 UITextField 文本?

Uva 11029 Leading and Trailing (求n^k前3位和后3位)