using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; namespace SPTarkov.Common.Extensions; public static class StringExtensions { private static readonly Dictionary _regexCache = new(); private static readonly Lock _regexCacheLock = new(); public static string RegexReplace( this string source, [StringSyntax(StringSyntaxAttribute.Regex)] string regexString, string newValue ) { Regex regex; lock (_regexCacheLock) { if (!_regexCache.TryGetValue(regexString, out regex)) { regex = new Regex(regexString); _regexCache[regexString] = regex; } } return regex.Replace(source, newValue); } public static bool RegexMatch( this string source, [StringSyntax(StringSyntaxAttribute.Regex)] string regexString, out Match? matchedString ) { Regex regex; lock (_regexCacheLock) { if (!_regexCache.TryGetValue(regexString, out regex)) { regex = new Regex(regexString); _regexCache[regexString] = regex; } } matchedString = null; if (!regex.IsMatch(source)) { return false; } matchedString = regex.Match(source); return true; } }