using System; using System.Text.RegularExpressions; namespace FastGithub.Configuration { /// /// 表示域名表达式 /// *表示除.之外任意0到多个字符 /// public class DomainPattern : IComparable { private readonly Regex regex; private readonly string domainPattern; /// /// 域名表达式 /// *表示除.之外任意0到多个字符 /// /// 域名表达式 public DomainPattern(string domainPattern) { this.domainPattern = domainPattern; var regexPattern = Regex.Escape(domainPattern).Replace(@"\*", @"[^\.]*"); this.regex = new Regex($"^{regexPattern}$", RegexOptions.IgnoreCase); } /// /// 与目标比较 /// /// /// public int CompareTo(DomainPattern? other) { if (other is null) { return 1; } var segmentsX = this.domainPattern.Split('.'); var segmentsY = other.domainPattern.Split('.'); var value = segmentsX.Length - segmentsY.Length; if (value != 0) { return value; } for (var i = segmentsX.Length - 1; i >= 0; i--) { var x = segmentsX[i]; var y = segmentsY[i]; value = Compare(x, y); if (value == 0) { continue; } return value; } return 0; } /// /// 比较两个分段 /// /// abc /// abc* /// private static int Compare(string x, string y) { var valueX = x.Replace('*', char.MaxValue); var valueY = y.Replace('*', char.MaxValue); return valueX.CompareTo(valueY); } /// /// 是否与指定域名匹配 /// /// /// public bool IsMatch(string domain) { return this.regex.IsMatch(domain); } /// /// 转换为文本 /// /// public override string ToString() { return this.domainPattern; } } }