【问题标题】:Searching for patterns in String, and removing在字符串中搜索模式并删除
【发布时间】:2012-10-31 12:30:22
【问题描述】:

我的任务是检查大量字符串值,并删除任何信用卡标志。因此,如果在字符串中找到任何匹配的内容(其中 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^”

【问题讨论】:

    标签: c# regex string


    【解决方案1】:
    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

    【讨论】:

    • 正则表达式不是静态的,所以我用我拥有的版本尝试了这个。请参阅原始问题 - 但我一定做错了什么?
    • @Craig Regex 类有一个静态方法 Replace。我在 VS 中尝试过,它有效。
    【解决方案2】:

    这是similar question,但没有选择答案。然而,票数最高的人建议web site 使用以下正则表达式:

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

    【讨论】:

      【解决方案3】:

      准备好,因为这个太棒了!

      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 联系客户”

      【讨论】:

        猜你喜欢
        • 2015-11-05
        • 2021-02-15
        • 1970-01-01
        • 2012-11-01
        • 2021-10-15
        • 1970-01-01
        • 2015-10-11
        相关资源
        最近更新 更多