public bool IsMatch(string value) { if (_pattern.Length == 0) { return(string.IsNullOrEmpty(value)); } if (value == null) { value = string.Empty; } if (_caseInsensitive) { value = value.ToLower(); } if (_firstElement == null) { _firstElement = Build(); } int valueIndex = 0; if (!_firstElement.IsMatch(value, ref valueIndex)) { return(false); } return(valueIndex == value.Length); }
internal static WildcardElement Create(string pattern, ref int patternIndex) { if (patternIndex >= pattern.Length) { return(null); } switch (pattern[patternIndex]) { case '*': return(WildcardAsteriskElement.Create(pattern, ref patternIndex)); case '?': return(WildcardQuestionElement.Create(pattern, ref patternIndex)); case '#': return(WildcardSharpElement.Create(pattern, ref patternIndex)); case '[': { int startIndex = patternIndex; WildcardElement element = WildcardRangeElement.Create(pattern, ref patternIndex); if (element == null) { patternIndex = startIndex; element = WildcardStringElement.Create(pattern, ref patternIndex); } return(element); } default: return(WildcardStringElement.Create(pattern, ref patternIndex)); } }
internal new static WildcardSharpElement Create(string pattern, ref int patternIndex) { patternIndex++; var element = new WildcardSharpElement(); element.Next = WildcardElement.Create(pattern, ref patternIndex); return(element); }
private WildcardElement Build() { string pattern = _pattern; if (_caseInsensitive) { pattern = pattern.ToLower(); } int patternIndex = 0; return(WildcardElement.Create(pattern, ref patternIndex)); }
internal new static WildcardStringElement Create(string pattern, ref int patternIndex) { int patternLength = pattern.Length; var builder = new StringBuilder(patternLength - patternLength); while (patternIndex < patternLength) { switch (pattern[patternIndex]) { case '\\': { patternIndex++; if (patternIndex < patternLength) { builder.Append(pattern[patternIndex++]); } } continue; case '*': case '?': case '#': case '[': break; default: { builder.Append(pattern[patternIndex++]); } continue; } break; } var element = new WildcardStringElement(); element.Pattern = builder.ToString(); element.Next = WildcardElement.Create(pattern, ref patternIndex); return(element); }
internal new static WildcardRangeElement Create(string pattern, ref int patternIndex) { patternIndex++; int patternLength = pattern.Length; bool negate = false; var chars = new HashSet <char>(); if (patternIndex < patternLength && pattern[patternIndex] == '!') { patternIndex++; negate = true; } bool closed = false; while (patternIndex < patternLength) { char ch = pattern[patternIndex]; switch (ch) { case ']': { patternIndex++; closed = true; } break; case '\\': { patternIndex++; if (patternIndex < patternLength) { ch = pattern[patternIndex++]; if (!chars.Contains(ch)) { chars.Add(ch); } } } continue; default: { if (char.IsLetter(ch)) { patternIndex++; if (patternIndex + 1 < patternLength && pattern[patternIndex] == '-' && char.IsLetter(pattern[patternIndex + 1])) { patternIndex++; // - char fromChar = ch; char toChar = pattern[patternIndex++]; for (char c = fromChar; c <= toChar; c++) { if (!chars.Contains(c)) { chars.Add(c); } } } else { if (!chars.Contains(ch)) { chars.Add(ch); } } } else if (char.IsDigit(ch)) { patternIndex++; if (patternIndex + 1 < patternLength && pattern[patternIndex] == '-' && char.IsDigit(pattern[patternIndex + 1])) { patternIndex++; // - char fromChar = ch; char toChar = pattern[patternIndex++]; for (char c = fromChar; c <= toChar; c++) { if (!chars.Contains(c)) { chars.Add(c); } } } else { if (!chars.Contains(ch)) { chars.Add(ch); } } } else { patternIndex++; if (!chars.Contains(ch)) { chars.Add(ch); } } } continue; } break; } if (!closed || chars.Count == 0) { return(null); } var element = new WildcardRangeElement(); element.Negate = negate; element.Chars = chars; element.Next = WildcardElement.Create(pattern, ref patternIndex); return(element); }