DomainPattern.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Text.RegularExpressions;
  3. namespace FastGithub.Configuration
  4. {
  5. /// <summary>
  6. /// 表示域名表达式
  7. /// *表示除.之外任意0到多个字符
  8. /// </summary>
  9. sealed class DomainPattern : IComparable<DomainPattern>
  10. {
  11. private readonly Regex regex;
  12. private readonly string domainPattern;
  13. /// <summary>
  14. /// 域名表达式
  15. /// *表示除.之外任意0到多个字符
  16. /// </summary>
  17. /// <param name="domainPattern">域名表达式</param>
  18. public DomainPattern(string domainPattern)
  19. {
  20. this.domainPattern = domainPattern;
  21. var regexPattern = Regex.Escape(domainPattern).Replace(@"\*", @"[^\.]*");
  22. this.regex = new Regex($"^{regexPattern}$", RegexOptions.IgnoreCase);
  23. }
  24. /// <summary>
  25. /// 与目标比较
  26. /// </summary>
  27. /// <param name="other"></param>
  28. /// <returns></returns>
  29. public int CompareTo(DomainPattern? other)
  30. {
  31. if (other is null)
  32. {
  33. return 1;
  34. }
  35. var segmentsX = this.domainPattern.Split('.');
  36. var segmentsY = other.domainPattern.Split('.');
  37. var value = segmentsX.Length - segmentsY.Length;
  38. if (value != 0)
  39. {
  40. return value;
  41. }
  42. for (var i = segmentsX.Length - 1; i >= 0; i--)
  43. {
  44. var x = segmentsX[i];
  45. var y = segmentsY[i];
  46. value = Compare(x, y);
  47. if (value == 0)
  48. {
  49. continue;
  50. }
  51. return value;
  52. }
  53. return 0;
  54. }
  55. /// <summary>
  56. /// 比较两个分段
  57. /// </summary>
  58. /// <param name="x">abc</param>
  59. /// <param name="y">abc*</param>
  60. /// <returns></returns>
  61. private static int Compare(string x, string y)
  62. {
  63. var valueX = x.Replace('*', char.MaxValue);
  64. var valueY = y.Replace('*', char.MaxValue);
  65. return valueX.CompareTo(valueY);
  66. }
  67. /// <summary>
  68. /// 是否与指定域名匹配
  69. /// </summary>
  70. /// <param name="domain"></param>
  71. /// <returns></returns>
  72. public bool IsMatch(string domain)
  73. {
  74. return this.regex.IsMatch(domain);
  75. }
  76. /// <summary>
  77. /// 转换为文本
  78. /// </summary>
  79. /// <returns></returns>
  80. public override string ToString()
  81. {
  82. return this.domainPattern;
  83. }
  84. }
  85. }