StringExtensions.cs 7.1 KB

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