2012-11-12 3 views
0

J'ai été chargé de parcourir une grande liste de valeurs de chaîne et de supprimer tout signe de carte de crédit. Donc, si, dans la chaîne, je trouve quelque chose qui correspond à (où n = numérique):Recherche de motifs dans String et suppression

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) 

Je dois remplacer cette partie de la chaîne avec [CARD NUMBER REMOVED]

Ainsi,

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

deviendrait:

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

Je pense regEx trouverais cela, mais j'ai aucune expérience regex, et il y a beaucoup de modèles. Et, comment puis-je remplacer cette partie?

Je pourrais écrire quelque chose qui se répète à travers chaque char et qui fait des vérifications de règles, mais cela semble hacky.

Des idées?

Je suis en train ceci:

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; 

Mais il ne semble pas trouver une correspondance dans ce:

"1234610008918730 ^^ 9-11 ^^ Code de 064 ^"

Répondre

3

Voici une similar question, mais aucune réponse sélectionnée. Le sommet a voté un a cependant suggéré un web site avec l'expression rationnelle suivante:

\b(?:\d[ -]*?){13,16}\b 
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]`"); 

Regex pour carte de crédit prise de here.

+0

Regex n'est pas statique, donc j'essayé, avec la version que j'ai. Voir la question originale - mais je dois faire quelque chose de mal? – Craig

+0

@Craig la classe 'Regex' a une méthode statique [Replace] (http://msdn.microsoft.com/en-us/library/e7f5w83z.aspx). J'ai essayé ça en VS, ça marche. –

0

Préparez-vous, car celui-ci est un 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]"); 

Ceci est légèrement modifié à partir d'une bibliothèque RegexBuddy. Ce que j'ai ajouté était la possibilité de séparer les nombres en utilisant des espaces, des tirets, des points, des virgules, des barres obliques et des barres obliques inversées dans n'importe quelle combinaison et dans n'importe quel style de regroupement.

Remarque: celui-ci correspond à l'exemple que vous avez donné ci-dessus. De plus, il ne correspondra pas aux numéros qui ont le même nombre de chiffres mais qui ne semblent pas être des numéros de carte de crédit valides.

Exemple: « S'il vous plaît appeler le client sur 5555 4141, 5555 3214 ou tout simplement lui envoyer un courriel à [email protected] »

Questions connexes