Regex capturing and replacing

CSharp · Console

/Program.cs

using System;
using System.Text.RegularExpressions;
					
public class Program
{
	private static string _requestXml;
	
	public static void Main()
	{
		_requestXml = 
@"
<Name>Sparky's Bank Account</Name>
<BankRoutingNumber>123456789</BankRoutingNumber>
<BankAccountNumber>987654321</BankAccountNumber>
";
		
		BasicFind();
		
		Console.WriteLine(new string('-', 100));
		BasicReplace();
		
		Console.WriteLine(new string('-', 100));
		Capturing();
		
		Console.WriteLine(new string('-', 100));
		CaptureNaming();
		
		Console.WriteLine(new string('-', 100));
		ReplaceWithFunction();
	}
	
	private static void BasicFind()
	{
		var regex = new Regex(@"<BankAccountNumber>\d+<\/BankAccountNumber>", RegexOptions.Compiled);

		foreach (Match match in regex.Matches(_requestXml))
		{
    		Console.WriteLine(match.Value);
		}
	}
	
	private static void BasicReplace()
	{
		var regex = new Regex(@"<BankAccountNumber>\d+<\/BankAccountNumber>", RegexOptions.Compiled);
		
		string censored = regex.Replace(_requestXml, "<BankAccountNumber>*********</BankAccountNumber>");

		Console.WriteLine(censored);
	}
	
	private static void Capturing()
	{
		var regex = new Regex(@"<BankAccountNumber>(\d+)<\/BankAccountNumber>", RegexOptions.Compiled);

		foreach (Match match in regex.Matches(_requestXml))
		{
			for (int i = 0; i < match.Groups.Count; i++)
			{
				Console.WriteLine($"[{i}] {match.Groups[i]}");
			}
		}
	}
	
	private static void CaptureNaming()
	{
		var regex = new Regex(@"<BankAccountNumber>(?<acctNum>\d+)<\/BankAccountNumber>", RegexOptions.Compiled);

		foreach (Match match in regex.Matches(_requestXml))
		{
			Console.WriteLine(match.Groups["acctNum"].Value);
		}
	}

	private static void ReplaceWithFunction()
	{
		var regex = new Regex(@"<BankAccountNumber>(?<acctNum>\d+)<\/BankAccountNumber>", RegexOptions.Compiled);
		
		string censored = regex.Replace(_requestXml, match =>
		{
			string accountNumber = match.Groups["acctNum"].Value;
			int length = accountNumber.Length;
			string masked = (length > 4) 
				? new string('*', length - 4) + accountNumber.Substring(length - 4) 
				: new string('*', length);
			return $"<BankAccountNumber>{masked}</BankAccountNumber>";
		});

		Console.WriteLine(censored);
	}
}
;