public static void Main()
Console.WriteLine(StringMatcher.IsStringPartOfString("4000", "1-2999999,70,600,40-59999999"));
Console.WriteLine(StringMatcher.IsStringPartOfString("75", "1-2999999,70,600,40-59999999"));
Console.WriteLine(StringMatcher.IsStringPartOfString("4000", "4*-5*,4???"));
Console.WriteLine(StringMatcher.IsStringPartOfString("50", "1*-2*,1?-2?"));
Console.WriteLine(StringMatcher.IsStringPartOfString("105", "1*-2*,1?-2?"));
public static class StringMatcher
public static bool IsStringPartOfString(string compareString, string identifierString)
var parts = identifierString.Split(',');
foreach (var part in parts)
var rangeParts = part.Split('-');
if (rangeParts.Length != 2)
throw new ArgumentException("The identifierString contains an invalid range.");
var start = GetNormalizedValue(rangeParts[0]);
var end = GetNormalizedValue(rangeParts[1]);
if (string.Compare(compareString, start, StringComparison.Ordinal) >= 0 &&
string.Compare(compareString, end, StringComparison.Ordinal) <= 0)
var normalizedPart = GetNormalizedValue(part);
if (string.Compare(compareString, normalizedPart, StringComparison.Ordinal) == 0)
private static string GetNormalizedValue(string value)
return value.Replace('?', '0').Replace('?', '9');
else if (value.Contains('*'))
return value.Replace('*', '0');