Beispiel #1
0
 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();
 }
Beispiel #2
0
        /// <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());
        }
Beispiel #3
0
 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();
 }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 /// <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();
 }
Beispiel #6
0
        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;
        }