using System.Diagnostics;
using System.Text.RegularExpressions;
public static long TicksBudget = 1000000;
public static string[] TestPatterns = new[]
@"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
@"^(\s?)?((\d+([\s\-\.]?\d+)?)|\d+)([\s\-\.]?((\d+([\s\-\.]?\d+)?)|\d+))*(\s?(x|ext|ex|p|poste)\.?\s?\d+)?$",
@"^\d+(?:[-.\s]\d+)*(?:\s?(?:ext?|x|poste|p)\.?\s?\d+)?$",
@"^(?:\+?\(?\d+\)?(?:[-.\s]\(?\d+\)?)*(?:\s?(?:Ext?|EXT?|ext?|X|x|POSTE|poste|P|p)\.?\s?\d+)?)$",
public static string[] TestInputs = new[]
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
@"\b(?<word>\w+)\s+(\k<word>)\b",
"55555555555555555555555555555555555555555555555$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
public static long BenchRegex(string pattern)
TimeSpan.FromTicks(TicksBudget));
var watch = new Stopwatch();
foreach (var input in TestInputs)
return watch.ElapsedTicks;
catch (ArgumentException)
Console.WriteLine("PARSE ERROR");
catch (RegexMatchTimeoutException)
Console.WriteLine("TIMEOUT");
public static void Main()
foreach (var pattern in TestPatterns)
Console.WriteLine($"Testing {pattern}");
var ticks = BenchRegex(pattern);
var budget = ticks >= 0 ? (double)ticks/TicksBudget*100 : 0;
Console.WriteLine($"... {ticks} ns ({budget}% budget spent)");