public GlobMatcher(string pattern, GlobMatcherOptions options = DefaultOptions) { if (pattern == null) throw new ArgumentNullException(nameof(pattern)); Options = options; Raw = pattern; _ignoreCase = Options.HasFlag(GlobMatcherOptions.IgnoreCase); _negate = ParseNegate(ref pattern, Options); _items = Compile(pattern).ToArray(); }
/// <summary> /// {a,b}c => [ac, bc] /// </summary> /// <param name="pattern"></param> /// <returns></returns> internal static string[] ExpandGroup(string pattern, GlobMatcherOptions options = DefaultOptions) { GlobUngrouper ungrouper = new GlobUngrouper(); bool escaping = false; bool disableEscape = !options.HasFlag(GlobMatcherOptions.AllowEscape); foreach (char c in pattern) { if (escaping) { if (c != ',' && c != '{' && c != '}') { ungrouper.AddChar('\\'); } ungrouper.AddChar(c); escaping = false; continue; } else if (c == '\\' && !disableEscape) { escaping = true; continue; } switch (c) { case '{': ungrouper.StartLevel(); break; case ',': if (ungrouper.Level < 1) { ungrouper.AddChar(c); } else { ungrouper.AddGroup(); } break; case '}': if (ungrouper.Level < 1) { // Unbalanced closing bracket matches nothing return(EmptyString); } ungrouper.FinishLevel(); break; default: ungrouper.AddChar(c); break; } } return(ungrouper.Flatten()); }
public GlobMatcher(string pattern, GlobMatcherOptions options = DefaultOptions) { if (pattern == null) { throw new ArgumentNullException(nameof(pattern)); } Options = options; Raw = pattern; _ignoreCase = Options.HasFlag(GlobMatcherOptions.IgnoreCase); _negate = ParseNegate(ref pattern, Options); _items = Compile(pattern).ToArray(); }
internal static bool ParseNegate(ref string pattern, GlobMatcherOptions options = DefaultOptions) { if (!options.HasFlag(GlobMatcherOptions.AllowNegate)) { return(false); } bool negate = false; int i = 0; while (i < pattern.Length && pattern[i] == NegateChar) { negate = !negate; i++; } if (i <= pattern.Length) { pattern = pattern.Substring(i); } return(negate); }
/// <summary> /// {a,b}c => [ac, bc] /// </summary> /// <param name="pattern"></param> /// <returns></returns> internal static string[] ExpandGroup(string pattern, GlobMatcherOptions options = DefaultOptions) { GlobUngrouper ungrouper = new GlobUngrouper(); bool escaping = false; bool disableEscape = !options.HasFlag(GlobMatcherOptions.AllowEscape); foreach (char c in pattern) { if (escaping) { if (c != ',' && c != '{' && c != '}') { ungrouper.AddChar('\\'); } ungrouper.AddChar(c); escaping = false; continue; } else if (c == '\\' && !disableEscape) { escaping = true; continue; } switch (c) { case '{': ungrouper.StartLevel(); break; case ',': if (ungrouper.Level < 1) { ungrouper.AddChar(c); } else { ungrouper.AddGroup(); } break; case '}': if (ungrouper.Level < 1) { // Unbalanced closing bracket matches nothing return EmptyString; } ungrouper.FinishLevel(); break; default: ungrouper.AddChar(c); break; } } return ungrouper.Flatten(); }
internal static bool ParseNegate(ref string pattern, GlobMatcherOptions options = DefaultOptions) { if (!options.HasFlag(GlobMatcherOptions.AllowNegate)) { return false; } bool negate = false; int i = 0; while (i < pattern.Length && pattern[i] == NegateChar) { negate = !negate; i++; } if (i <= pattern.Length) { pattern = pattern.Substring(i); } return negate; }