using System.Text.RegularExpressions;
public static void Main()
Console.WriteLine("----------------------------TEST PAN--------------------------------------------------------");
TestCC("123456789123", "xxxxxxxx9123");
TestCC("1234-5678-9123-4567", "xxxx-xxxx-xxxx-4567");
TestCC("123123123123131For8640", "xxxxxxxxxxx3131For8640");
TestCC("123123123123131to123123123123177", "xxxxxxxxxxx3131toxxxxxxxxxxx3177");
TestCC("1234-5678-9123-4567-891", "xxxx-xxxx-xxxx-xxx7-891");
TestCC("1234 5678 9123 4567", "xxxx xxxx xxxx 4567");
TestCC("1234567", "1234567");
TestCC("631000028404","xxxxxxxx8404");
TestCC("173052593000056901","xxxxxxxxxxxxxx6901");
TestCC("77768913006","77768913006");
TestCC("01816000060619511074","01816000060619511074");
Console.WriteLine("-----------------------------TEST ACCOUNT NUM-------------------------------------------------------");
TestAccNo("12345678","xxxx5678");
TestAccNo("123456789","xxxxx6789");
TestAccNo("1234567","1234567");
Console.WriteLine("----------------------------TEST BOTH--------------------------------------------------------");
TestCCAndAccNo("1234-5678-1234-1234","xxxx-xxxx-xxxx-1234");
TestCCAndAccNo("1234 5678 1234 1234","xxxx xxxx xxxx 1234");
TestCCAndAccNo("no1234567890123abc","noxxxxxxxxx0123abc");
TestCCAndAccNo("Im paying 2700 dollars with my credit card(123456789012345) to my account(12345678)","Im paying 2700 dollars with my credit card(xxxxxxxxxxx2345) to my account(xxxx5678)");
TestCC("Im paying 2700 dollars with my credit card(123456789012345) to my account(12345678)","Im paying 2700 dollars with my credit card(xxxxxxxxxxx2345) to my account(12345678)");
TestCCAndAccNo("from INV 242085229 to SAV 01654876","from INV xxxxx5229 to SAV xxxx4876");
TestCCAndAccNo("from INV 2420852290 to SAV 0165487","from INV 2420852290 to SAV 0165487");
TestCCAndAccNo("pan19 digits: 1234567890123456789 o","pan19 digits: xxxxxxxxxxxxxxx6789 o");
TestCCAndAccNo("11 digits: 12345678901","11 digits: 12345678901");
TestCCAndAccNo("testing pan 12 digits: 123456789012","testing pan 12 digits: xxxxxxxx9012");
TestCCAndAccNo("20 digits: 12345678901234567890 end","20 digits: 12345678901234567890 end");
TestCCAndAccNo("pan 18 digits: 123456789012345678 end","pan 18 digits: xxxxxxxxxxxxxx5678 end");
TestCCAndAccNo("TFR 02062702 with 12345678901234567890 e","TFR xxxx2702 with 12345678901234567890 e");
TestCCAndAccNo("TFR 02062702 with 123456789012345678","TFR xxxx2702 with xxxxxxxxxxxxxx5678");
TestCCAndAccNo("TFR 02062702 with 123456789012 end","TFR xxxx2702 with xxxxxxxx9012 end");
TestCCAndAccNo("TFR 02062702 with 12345678901 end","TFR xxxx2702 with 12345678901 end");
TestCCAndAccNo("TFR 02062702 with 1234567890123456789","TFR xxxx2702 with xxxxxxxxxxxxxxx6789");
TestCCAndAccNo("Transfer to SAV 12016643 to 1 a Ong - 525","Transfer to SAV xxxx6643 to 1 a Ong - 525");
TestCCAndAccNo("Biller code 3038 - Receipt No 3514616375 221414441406","Biller code 3038 - Receipt No 3514616375 xxxxxxxx1406");
TestCCAndAccNo("Biller code 3038 - Receipt No 351461637 221414441406","Biller code 3038 - Receipt No xxxxx1637 xxxxxxxx1406");
TestCCAndAccNo("Biller code 3038 - Receipt No 221414441406 3514616375","Biller code 3038 - Receipt No xxxxxxxx1406 3514616375");
TestCCAndAccNo("Biller code 3038 - Receipt No 221414441406 351461637","Biller code 3038 - Receipt No xxxxxxxx1406 xxxxx1637");
TestCCAndAccNo("Biller code 3038 - Receipt No 22141444140 351461637","Biller code 3038 - Receipt No 22141444140 xxxxx1637");
TestCCAndAccNo("Biller code 3038 - Receipt No 22141444140 3514616375","Biller code 3038 - Receipt No 22141444140 3514616375");
public static void TestCC(string @value, string expected)
var result = @value.MaskCCNo();
result.Should().Be(expected);
Console.WriteLine($"{@value} => {result}");
public static void TestAccNo(string @value, string expected)
var result = @value.MaskAccNo();
result.Should().Be(expected);
Console.WriteLine($"{@value} => {result}");
public static void TestCCAndAccNo(string @value, string expected)
var result = @value.MaskIfContainCreditCardPanorAcctNumNew();
result.Should().Be(expected);
Console.WriteLine($"{@value} => {result}");
public static class MaskingExtensions
public static string MaskCCNo(this string value)
var a = Regex.Replace(value, @"(?<!\d)\d(?:[\s-]?\d){11,18}(?!\d)", m => Regex.Replace(m.Value, @"\d(?=(?:[\s-]?\d){4})", "x"));
public static string MaskAccNo(this string value)
var a = Regex.Replace(value, @"(?<!\d)\d(?:[-]?\d){7,8}(?!\d)", m => Regex.Replace(m.Value, @"\d(?=(?:[-]?\d){4})", "x"));
public static string MaskIfContainCreditCardPanorAcctNumNew(this string value)
if (string.IsNullOrEmpty(value))
var maskedCCNumber = value.MaskCCNo();
return maskedCCNumber.MaskAccNo();