using System.Collections.Generic;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Toolchains.InProcess.Emit;
using Perfolizer.Horology;
using BenchmarkDotNet.Loggers;
using System.Text.RegularExpressions;
[assembly: System.Diagnostics.Debuggable(isJITTrackingEnabled: false, isJITOptimizerDisabled: false)]
BenchmarkRunner.Run<ComparisonBenchmarkTests>(DefaultConfig.Instance.AddJob(Job.Default.WithToolchain(new InProcessEmitToolchain(timeout: TimeSpan.FromSeconds(9), logOutput: false)).WithLaunchCount(1).WithWarmupCount(5).WithIterationCount(20).WithIterationTime(TimeInterval.FromMilliseconds(80))).AddLogger(new ConsoleLogger(unicodeSupport: true, ConsoleLogger.CreateGrayScheme())).WithOptions(ConfigOptions.DisableLogFile));
public class ComparisonBenchmarkTests
[Params("DE12500123456789012345")]
public string Iban { get; set; }
public void RegexConcat()
var groupRegex = new Regex(@"^([A-Z]{2})(?<Ast>\d{5})(\d{5})(?<Ast>.*)(\d{3})$");
var x = groupRegex.ReplaceGroup(Iban, "Ast", '*');
var masked = $"{Iban[0..2]}{"".PadRight(5, '*')}{Iban[7..12]}{"".PadRight(Iban.Length - 15, '*')}{Iban[^3..]}";
var masked = Regex.Replace(Iban, @"(?<=^[A-Z]{2}(?:\d{0,4}|\d{10,}(?=\d{4,}$)))\d", "*");
public static string ReplaceGroup(this Regex regex, string input, string groupName, char pattern)
return regex.Replace(input, m =>
var group = m.Groups[groupName];
var sb = new StringBuilder();
var previousCaptureEnd = 0;
foreach (var capture in group.Captures.Cast<Capture>())
var currentCaptureEnd = capture.Index + capture.Length - m.Index;
var currentCaptureLength = capture.Index - m.Index - previousCaptureEnd;
sb.Append(m.Value.Substring(previousCaptureEnd, currentCaptureLength));
sb.Append("".PadRight(currentCaptureLength, pattern));
previousCaptureEnd = currentCaptureEnd;
sb.Append(m.Value.Substring(previousCaptureEnd));