/// <summary> /// Gets the regex that represents the given filter group /// </summary> /// <param name="filterGroupName">Filter group name</param> /// <returns>Group regex</returns> private static Regex GetFilterGroupRegex(string filterGroupName) { FilterGroup filterGroup = FilterGroups.ParseFilterList(filterGroupName, FilterGroup.None); Regex result; if (FilterEntry.filterGroupRegexCache.TryGetValue(filterGroup, out result)) { return(result); } else { // Get the filter strings for this filter group, and convert them to their regex forms List <string> regexStrings = FilterGroups.GetFilterStrings(filterGroup) .Select(filterString => { if (filterString.StartsWith("[", StringComparison.Ordinal) && filterString.EndsWith("]", StringComparison.Ordinal)) { return(filterString.Substring(1, filterString.Length - 2)); } else if (filterString.StartsWith("@", StringComparison.Ordinal)) { return(Utility.ConvertLiteralToRegExp(filterString.Substring(1))); } else { return(Utility.ConvertGlobbingToRegExp(filterString)); } }) .ToList(); string regexString; if (regexStrings.Count == 1) { regexString = regexStrings.Single(); } else { // If there are multiple regex strings, then they need to be merged by wrapping each in parenthesis and ORing them together regexString = "(" + string.Join(")|(", regexStrings) + ")"; } result = new Regex(regexString, REGEXP_OPTIONS); FilterEntry.filterGroupRegexCache[filterGroup] = result; return(result); } }
private static IEnumerable <string> Expand(string filter) { if (string.IsNullOrWhiteSpace(filter)) { return(null); } if (filter.Length < 2 || (filter.StartsWith("[", StringComparison.Ordinal) && filter.EndsWith("]", StringComparison.Ordinal))) { return(new string[] { filter }); } if (filter.StartsWith("{", StringComparison.Ordinal) && filter.EndsWith("}", StringComparison.Ordinal)) { string groupName = filter.Substring(1, filter.Length - 2); FilterGroup filterGroup = FilterGroups.ParseFilterList(groupName, FilterGroup.None); return((filterGroup == FilterGroup.None) ? null : FilterGroups.GetFilterStrings(filterGroup)); } return(filter.Split(new char[] { System.IO.Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries)); }