0

我的任务是浏览大量字符串值,并删除任何信用卡迹象。因此,如果在字符串中找到任何匹配的内容(其中 n = 数字):

nnnn nnnn nnnn nnnn (4 x 4 numerical)
nnnnnnnnnnnnnnnn (16 numerical)
nnnn-nnnn-nnnn-nnnn (Hyphened)
nnnn nnnnnn nnnn (American express?)
nnnnnnnnnnnnnn (AX, no spaces)
nnnn-nnnnnn-nnnn (AX, Hyphened)

我需要将字符串的那部分替换为[CARD NUMBER REMOVED]

所以,

"Client called and gave credit card details as 1234123412341234, exp 1201, and will be booked next week"

会成为:

"Client called and gave credit card details as `[CARD NUMBER REMOVED]`, exp 1201, and will be booked next week"

我在想 RegEx 会找到这个,但我的正则表达式经验为零,而且有很多模式。而且,我该如何更换那部分?

我可以编写一些遍历每个字符并进行一些规则检查的东西,但这似乎很老套。

有任何想法吗?

我正在尝试这个:

    const string pattern = @"^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$";
    const string replacement = "[CARD DETAILS REMOVED]";
    var rgx = new Regex(pattern);
    string cleansedText = rgx.Replace(UncleansedText, replacement);
    return cleansedText;

但它似乎没有找到匹配项:

“1234610008918730^^9-11^^代码064^”

4

3 回答 3

3

这是一个类似的问题,但没有选择答案。然而,最高投票者建议使用以下正则表达式的网站:

\b(?:\d[ -]*?){13,16}\b
于 2012-11-12T02:53:04.963 回答
0
myString = Regex.Replace(myString, 
    @"(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})", 
    "`[CARD NUMBER REMOVED]`");

信用卡的正则表达式取自此处

于 2012-11-12T02:47:04.173 回答
0

准备好,因为这是一个doosy!

Regex regexObj = new Regex(@"(?:(?<visa>4[ -.,/\\]*(?:\d[ -.,/\\]*){11}(?:(?:\d[ -.,/\\]*){3})?\d)|(?<mastercard>5[ -.,/\\]*[1-5](?:[ -.,/\\]*[0-9]){14})|(?<discover>6[ -.,/\\]*(?:0[ -.,/\\]*1[ -.,/\\]*1|5[ -.,/\\]*\d[ -.,/\\]*\d)(?:[ -.,/\\]*[0-9]){12})|(?<amex>3[ -.,/\\]*[47](?:[ -.,/\\]*[0-9]){13})|(?<diners>3[ -.,/\\]*(?:0[ -.,/\\]*[0-5]|[68][ -.,/\\]*[0-9])(?:[ -.,/\\]*[0-9]){11}) |(?<jcb>(?:2[ -.,/\\]*1[ -.,/\\]*3[ -.,/\\]*1|1[ -.,/\\]*8[ -.,/\\]*0[ -.,/\\]*0|3[ -.,/\\]*5(?:[ -.,/\\]*[0-9]){3})(?:[ -.,/\\]*[0-9]){11}))");
resultString = regexObj.Replace(subjectString, "[CARD DETAILS REMOVED]");

这是从 RegexBuddy 库稍微修改的。我添加的是使用空格、破折号、句点、逗号、正斜杠和反斜杠以任何组合和任何分组样式分隔数字的能力。

注意:这将与您上面给出的示例相匹配。

此外,它不会匹配具有相同位数但似乎不是有效信用卡号的数字。

示例:“请致电 5555 4141、5555 3214 或发送电子邮件至 ourclient@example.com 联系客户”

于 2012-11-12T03:06:07.487 回答