在String中搜索模式,然后删除

时间:2012-11-12 02:38:37

标签: c# regex string

我的任务是查看大量的字符串值,并删除任何信用卡的标志。所以,如果在字符串中,我发现任何匹配的东西(其中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 ^^ Code 064 ^”

3 个答案:

答案 0 :(得分:3)

这是一个similar question,但没有选定的答案。最高投票的人建议web site使用以下正则表达式:

\b(?:\d[ -]*?){13,16}\b

答案 1 :(得分: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]`");

here获取信用卡的正则表达式。

答案 2 :(得分:0)

准备好了,因为这个是一个多愁善感!

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”