StringExtensions.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. namespace MeloongCore.Extensions {
  4. public static class StringExtensions {
  5. #region 区域性 / 大小写 简化
  6. /// <summary>
  7. /// 高速的 StartsWith。
  8. /// </summary>
  9. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  10. public static bool StartsWithF(this string value, string prefix, bool ignoreCase = false) {
  11. if (value == null) return false;
  12. return value.StartsWith(prefix, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  13. }
  14. /// <summary>
  15. /// 高速的 EndsWith。
  16. /// </summary>
  17. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  18. public static bool EndsWithF(this string value, string suffix, bool ignoreCase = false) {
  19. if (value == null) return false;
  20. return value.EndsWith(suffix, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  21. }
  22. /// <summary>
  23. /// 忽略大小写的 Contains。
  24. /// </summary>
  25. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  26. public static bool ContainsIgnoreCase(this string value, string subString) {
  27. return value.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0;
  28. }
  29. /// <summary>
  30. /// 高速的 IndexOf。
  31. /// </summary>
  32. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  33. public static int IndexOfF(this string value, string subString, bool ignoreCase = false) {
  34. return value.IndexOf(subString, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  35. }
  36. /// <summary>
  37. /// 高速的 IndexOf。
  38. /// </summary>
  39. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  40. public static int IndexOfF(this string value, string subString, int startIndex, bool ignoreCase = false) {
  41. return value.IndexOf(subString, startIndex, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  42. }
  43. /// <summary>
  44. /// 高速的 LastIndexOf。
  45. /// </summary>
  46. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  47. public static int LastIndexOfF(this string value, string subString, bool ignoreCase = false) {
  48. return value.LastIndexOf(subString, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  49. }
  50. /// <summary>
  51. /// 高速的 LastIndexOf。
  52. /// </summary>
  53. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  54. public static int LastIndexOfF(this string value, string subString, int startIndex, bool ignoreCase = false) {
  55. return value.LastIndexOf(subString, startIndex, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
  56. }
  57. /// <summary>
  58. /// ToLowerInvariant 的简略写法。
  59. /// </summary>
  60. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  61. public static string Lower(this string str) => str.ToLowerInvariant();
  62. /// <summary>
  63. /// ToUpperInvariant 的简略写法。
  64. /// </summary>
  65. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  66. public static string Upper(this string str) => str.ToUpperInvariant();
  67. #endregion
  68. #region 分割与裁切
  69. /// <summary>
  70. /// 分割字符串。
  71. /// 若原始字符串为空,则返回 {""}。
  72. /// </summary>
  73. public static string[] Split(this string fullStr, string splitStr) {
  74. if (splitStr.IsSingle())
  75. return fullStr.Split(splitStr[0]);
  76. else
  77. return fullStr.Split(new[] {splitStr}, StringSplitOptions.None);
  78. }
  79. /// <summary>
  80. /// 获取在子字符串第一次出现之前的部分,例如对 2024/11/08 拆切 / 会得到 2024。
  81. /// 如果未找到子字符串则不裁切。
  82. /// </summary>
  83. public static string BeforeFirst(this string str, string text, bool ignoreCase = false) {
  84. int pos = string.IsNullOrEmpty(text) ? -1 : str.IndexOfF(text, ignoreCase);
  85. if (pos >= 0)
  86. return str.Substring(0, pos);
  87. else
  88. return str;
  89. }
  90. /// <summary>
  91. /// 获取在子字符串最后一次出现之前的部分,例如对 2024/11/08 拆切 / 会得到 2024/11。
  92. /// 如果未找到子字符串则不裁切。
  93. /// </summary>
  94. public static string BeforeLast(this string str, string text, bool ignoreCase = false) {
  95. int pos = string.IsNullOrEmpty(text) ? -1 : str.LastIndexOfF(text, ignoreCase);
  96. if (pos >= 0)
  97. return str.Substring(0, pos);
  98. else
  99. return str;
  100. }
  101. /// <summary>
  102. /// 获取在子字符串第一次出现之后的部分,例如对 2024/11/08 拆切 / 会得到 11/08。
  103. /// 如果未找到子字符串则不裁切。
  104. /// </summary>
  105. public static string AfterFirst(this string str, string text, bool ignoreCase = false) {
  106. int pos = string.IsNullOrEmpty(text) ? -1 : str.IndexOfF(text, ignoreCase);
  107. if (pos >= 0)
  108. return str.Substring(pos + text.Length);
  109. else
  110. return str;
  111. }
  112. /// <summary>
  113. /// 获取在子字符串最后一次出现之后的部分,例如对 2024/11/08 拆切 / 会得到 08。
  114. /// 如果未找到子字符串则不裁切。
  115. /// </summary>
  116. public static string AfterLast(this string str, string text, bool ignoreCase = false) {
  117. int pos = string.IsNullOrEmpty(text) ? -1 : str.LastIndexOfF(text, ignoreCase);
  118. if (pos >= 0)
  119. return str.Substring(pos + text.Length);
  120. else
  121. return str;
  122. }
  123. /// <summary>
  124. /// 获取处于两个子字符串之间的部分,裁切尽可能多的内容。
  125. /// 等效于 AfterLast 后接 BeforeFirst。
  126. /// 如果未找到子字符串则不裁切。
  127. /// </summary>
  128. public static string Between(this string str, string after, string before, bool ignoreCase = false) {
  129. int startPos = string.IsNullOrEmpty(after) ? -1 : str.LastIndexOfF(after, ignoreCase);
  130. if (startPos >= 0)
  131. startPos += after.Length;
  132. else
  133. startPos = 0;
  134. int endPos = string.IsNullOrEmpty(before) ? -1 : str.IndexOfF(before, startPos, ignoreCase);
  135. if (endPos >= 0)
  136. return str.Substring(startPos, endPos - startPos);
  137. else if (startPos > 0)
  138. return str.Substring(startPos);
  139. else
  140. return str;
  141. }
  142. #endregion
  143. /// <summary>
  144. /// 将第一个字符转换为大写,其余字符转换为小写。
  145. /// </summary>
  146. public static string Capitalize(this string word) {
  147. if (string.IsNullOrEmpty(word)) return word;
  148. return word.Substring(0, 1).Upper() + word.Substring(1).Lower();
  149. }
  150. }
  151. }