Skip to content

Commit

Permalink
Renaming, avoid passing Path.DirectorySeparatorChar and remove non ca…
Browse files Browse the repository at this point in the history
…pturing group
  • Loading branch information
CristianAmbrosini committed Mar 15, 2023
1 parent 7f12812 commit 8bd1769
Showing 1 changed file with 13 additions and 22 deletions.
Expand Up @@ -40,16 +40,14 @@ private sealed class WildcardPattern
private static readonly ConcurrentDictionary<string, WildcardPattern> Cache = new();
private readonly Regex pattern;

private WildcardPattern(string pattern, string directorySeparator) =>
this.pattern = new Regex(ToRegexp(pattern, directorySeparator), RegexOptions.Compiled, RegexConstants.DefaultTimeout);
private WildcardPattern(string pattern) =>
this.pattern = new Regex(ToRegex(pattern), RegexOptions.None, RegexConstants.DefaultTimeout);

public bool Match(string value)
{
value = value.TrimStart('/');
value = value.TrimEnd('/');
try
{
return pattern.IsMatch(value);
return pattern.IsMatch(value.Trim('/'));
}
catch (RegexMatchTimeoutException)
{
Expand All @@ -58,14 +56,11 @@ public bool Match(string value)
}

public static WildcardPattern Create(string pattern) =>
Create(pattern, Path.DirectorySeparatorChar.ToString());
Cache.GetOrAdd(pattern + Path.DirectorySeparatorChar, _ => new WildcardPattern(pattern));

private static WildcardPattern Create(string pattern, string directorySeparator) =>
Cache.GetOrAdd(pattern + directorySeparator, _ => new WildcardPattern(pattern, directorySeparator));

private static string ToRegexp(string wildcardPattern, string directorySeparator)
private static string ToRegex(string wildcardPattern)
{
var escapedDirectorySeparator = '\\' + directorySeparator;
var escapedDirectorySeparator = Regex.Escape(Path.DirectorySeparatorChar.ToString());
var sb = new StringBuilder(wildcardPattern.Length);

sb.Append('^');
Expand All @@ -75,10 +70,10 @@ private static string ToRegexp(string wildcardPattern, string directorySeparator
{
var ch = wildcardPattern[i];

if (SpecialChars.IndexOf(ch) != -1)
if (SpecialChars.Contains(ch))
{
// Escape regexp-specific characters
sb.Append('\\').Append(ch);
// Escape regex-specific characters
sb.Append(Regex.Escape(ch.ToString()));
}
else if (ch == '*')
{
Expand All @@ -88,7 +83,7 @@ private static string ToRegexp(string wildcardPattern, string directorySeparator
// Zero or more directories
if (i + 2 < wildcardPattern.Length && IsSlash(wildcardPattern[i + 2]))
{
sb.Append("(?:.*").Append(escapedDirectorySeparator).Append("|)");
sb.Append($"(.*{escapedDirectorySeparator}|)");
i += 2;
}
else
Expand All @@ -101,13 +96,13 @@ private static string ToRegexp(string wildcardPattern, string directorySeparator
{
// Single asterisk
// Zero or more characters excluding directory separator
sb.Append("[^").Append(escapedDirectorySeparator).Append("]*?");
sb.Append($"[^{escapedDirectorySeparator}]*?");
}
}
else if (ch == '?')
{
// Any single character excluding directory separator
sb.Append("[^").Append(escapedDirectorySeparator).Append("]");
sb.Append($"[^{escapedDirectorySeparator}]");
}
else if (IsSlash(ch))
{
Expand All @@ -119,13 +114,9 @@ private static string ToRegexp(string wildcardPattern, string directorySeparator
// Single character
sb.Append(ch);
}

i++;
}

sb.Append('$');

return sb.ToString();
return sb.Append('$').ToString();
}

private static bool IsSlash(char ch) =>
Expand Down

0 comments on commit 8bd1769

Please sign in to comment.