59 lines
1.7 KiB
C#
59 lines
1.7 KiB
C#
using System;
|
|
|
|
namespace ZR.Infrastructure.Resolver;
|
|
|
|
public static class AntPathMatcher
|
|
{
|
|
public static bool Match(string pattern, string value)
|
|
{
|
|
if (pattern == null || value == null)
|
|
return false;
|
|
|
|
if (pattern == "**")
|
|
return true;
|
|
|
|
var patternSegments = pattern.Split('/');
|
|
var valueSegments = value.Split('/');
|
|
|
|
int patternIndex = 0;
|
|
int valueIndex = 0;
|
|
int patternWildcardIndex = -1;
|
|
int valueWildcardIndex = -1;
|
|
|
|
while (valueIndex < valueSegments.Length)
|
|
{
|
|
if (patternIndex < patternSegments.Length && IsMatch(patternSegments[patternIndex], valueSegments[valueIndex]))
|
|
{
|
|
patternIndex++;
|
|
valueIndex++;
|
|
}
|
|
else if (patternWildcardIndex != -1)
|
|
{
|
|
patternIndex = patternWildcardIndex + 1;
|
|
valueIndex = ++valueWildcardIndex;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
while (patternIndex < patternSegments.Length && patternSegments[patternIndex] == "**")
|
|
{
|
|
patternIndex++;
|
|
}
|
|
|
|
return patternIndex >= patternSegments.Length && valueIndex >= valueSegments.Length;
|
|
}
|
|
|
|
private static bool IsMatch(string patternSegment, string valueSegment)
|
|
{
|
|
if (patternSegment == "*")
|
|
return true;
|
|
|
|
if (patternSegment.StartsWith("{") && patternSegment.EndsWith("}"))
|
|
return true; // 支持占位符的匹配逻辑
|
|
|
|
return string.Equals(patternSegment, valueSegment, StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
} |