You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
9.0 KiB

  1. using Apewer;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace Apewer.Internals
  6. {
  7. internal class TextVerifier
  8. {
  9. /// <summary>验证符串在父字符串中出现的次数。</summary>
  10. /// <param name="argParent">父字符串。</param>
  11. /// <param name="argSub">子字符串。</param>
  12. /// <param name="argIgnoreCase">是否忽略大小写。</param>
  13. public static int Exists(string argParent, string argSub, bool argIgnoreCase = false)
  14. {
  15. if (string.IsNullOrEmpty(argParent) || string.IsNullOrEmpty(argSub)) return 0;
  16. string vp = argParent;
  17. string vs = argSub;
  18. int vr = 0;
  19. int vl;
  20. int vi;
  21. try
  22. {
  23. if (argIgnoreCase) { vp = TextHelper.LCase(vp); vs = TextHelper.LCase(vs); }
  24. vl = vs.Length;
  25. vi = 1;
  26. while (vi <= (vp.Length - vl + 1))
  27. {
  28. if (TextHelper.Mid(vp, vi, vl) == vs) { vr += 1; vi += vl; }
  29. else vi += 1;
  30. }
  31. return vr;
  32. }
  33. catch { return 0; }
  34. }
  35. /// <summary>验证字符或字符串是否全部存在于字符池,默认选项等效于判断 (exists > 0) 是否为 True。</summary>
  36. /// <param name="argPool">字符池,允许出现的字符组合。</param>
  37. /// <param name="argSub">要查找的字符或字符串。</param>
  38. /// <returns>若 _sub 不存在于 _parent,则返回 False。</returns>
  39. public static bool Include(string argPool, string argSub)
  40. {
  41. return Include(argPool, argSub, false, false);
  42. }
  43. /// <summary>验证字符或字符串是否全部存在于字符池,默认选项等效于判断 (exists > 0) 是否为 True。</summary>
  44. /// <param name="argPool">字符池,允许出现的字符组合。</param>
  45. /// <param name="argSub">要查找的字符或字符串。</param>
  46. /// <param name="argAlone">分别验证 _sub 里的每个字符,若为 False 则验证 _sub 整体。</param>
  47. /// <returns>若 _sub 或 _sub 中任何一个字符不存在于 _parent,则返回 False。</returns>
  48. public static bool Include(string argPool, string argSub, bool argAlone)
  49. {
  50. return Include(argPool, argSub, argAlone, false);
  51. }
  52. /// <summary>验证字符或字符串是否全部存在于字符池,默认选项等效于判断 (exists > 0) 是否为 True。</summary>
  53. /// <param name="argPool">字符池,允许出现的字符组合。</param>
  54. /// <param name="argSub">要查找的字符或字符串。</param>
  55. /// <param name="argAlone">分别验证 _sub 里的每个字符,若为 False 则验证 _sub 整体。</param>
  56. /// <param name="argIgnoreCase">是否忽略大小写。</param>
  57. /// <returns>若 _sub 或 _sub 中任何一个字符不存在于 _parent,则返回 False。</returns>
  58. public static bool Include(string argPool, string argSub, bool argAlone = false, bool argIgnoreCase = false)
  59. {
  60. //{
  61. // bool vnp = string.IsNullOrEmpty(argpool);
  62. // bool vns = string.IsNullOrEmpty(argsub);
  63. // if (vnp && vns) return true;
  64. // if ((!vnp) && vns) return true;
  65. // if (vnp && (!vns)) return false;
  66. //}
  67. ////try
  68. //{
  69. // string vp = argpool;
  70. // string vs = argsub;
  71. // if (argignorecase) { vp = vp.ToLower(); vs = vs.ToLower(); }
  72. // if (argalone)
  73. // {
  74. // string vc;
  75. // int vl = 0;
  76. // for (int vi = 1; vi <= vs.Length; vi++)
  77. // {
  78. // vc = Mid(vs, vi, 1);
  79. // int vinstr = InStr(vp, vc);
  80. // if (InStr(vp, vc) > 0) vl += 1;
  81. // }
  82. // if (vl == vs.Length) return true;
  83. // }
  84. // else
  85. // {
  86. // if (InStr(vp, vs) > 0) return true;
  87. // }
  88. // return false;
  89. //}
  90. ////catch
  91. ////{
  92. //// return false;
  93. ////}
  94. bool vnp = string.IsNullOrEmpty(argPool);
  95. bool vns = string.IsNullOrEmpty(argSub);
  96. if (vnp && vns) return true;
  97. if ((!vnp) && vns) return true;
  98. if (vnp && (!vns)) return false;
  99. //try
  100. {
  101. string vp = string.IsNullOrEmpty(argPool) ? "" : argPool;
  102. string vs = string.IsNullOrEmpty(argSub) ? "" : argSub;
  103. if (argIgnoreCase) { vp = vp.ToLower(); vs = vs.ToLower(); }
  104. if (argAlone)
  105. {
  106. var vcount = 0;
  107. for (int vi = 0; vi < vs.Length; vi++)
  108. {
  109. if (vp.Contains(vs[vi].ToString())) vcount += 1; else break;
  110. }
  111. return vcount == vs.Length;
  112. }
  113. else
  114. {
  115. return argPool.Contains(argSub);
  116. }
  117. }
  118. //catch
  119. //{
  120. // return false;
  121. //}
  122. }
  123. /// <summary>验证字符串内容是否为 IP v4 地址,格式为“0.0.0.0”。</summary>
  124. public static bool IsIP(string argIp)
  125. {
  126. if (string.IsNullOrEmpty(argIp)) return false;
  127. try
  128. {
  129. string[] va;
  130. va = TextUtility.Split(argIp, '.');
  131. if (va.Length != 4) return false;
  132. for (int i = 0; i <= 3; i++)
  133. {
  134. if (!IsInteger(va[i])) return false;
  135. int vint = System.Convert.ToInt32(va[i]);
  136. if (vint < 0) return false;
  137. if (vint > 255) return false;
  138. }
  139. return true;
  140. }
  141. catch
  142. {
  143. return false;
  144. }
  145. }
  146. ///<summary>验证字符串内容是否为数字,包含整数和小数。</summary>
  147. public static bool IsNumber(string argText)
  148. {
  149. if (IsInteger(argText)) return true;
  150. if (IsDecimal(argText)) return true;
  151. return false;
  152. }
  153. /// <summary>验证字符串内容是否为整数。</summary>
  154. public static bool IsInteger(string argText)
  155. {
  156. //try
  157. {
  158. if (string.IsNullOrEmpty(argText)) return false;
  159. string vtext = argText.Trim();
  160. if (string.IsNullOrEmpty(vtext)) return false;
  161. if (vtext.StartsWith("-")) vtext = TextHelper.Mid(vtext, 2, TextHelper.Len(vtext) - 1);
  162. return Include(Constant.NumberCollection, vtext, true);
  163. }
  164. // catch { return false; }
  165. }
  166. /// <summary>验证字符串内容是否为小数,格式:0.0。</summary>
  167. public static bool IsDecimal(string argText)
  168. {
  169. // try
  170. {
  171. string vtext = argText.Trim();
  172. if (string.IsNullOrEmpty(vtext)) return false;
  173. string[] va;
  174. va = TextUtility.Split(vtext, '.');
  175. if (va.Length == 2)
  176. {
  177. for (int vi = 0; vi <= 1; vi++) if (!IsInteger(va[vi])) return false;
  178. return true;
  179. }
  180. return false;
  181. }
  182. // catch { return false; }
  183. }
  184. /// <summary>验证字符串内所有字符是否均为十六进制字符。</summary>
  185. public static bool IsHex(string argText)
  186. {
  187. return Include(Constant.HexCollection, argText, true, true);
  188. }
  189. /// <summary>验证字符串内所有字符是否均为字母。</summary>
  190. public static bool IsLetter(string argText)
  191. {
  192. if (string.IsNullOrEmpty(argText)) return false;
  193. return Include(Constant.LetterCollection, argText, true, false);
  194. }
  195. /// <summary>验证字符串内所有字符是否均为大写字母。</summary>
  196. public static bool IsUpper(string argText)
  197. {
  198. if (string.IsNullOrEmpty(argText)) return false;
  199. return Include(Constant.UpperCollection, argText, true, true);
  200. }
  201. /// <summary>验证字符串内所有字符是否均为小写字母。</summary>
  202. public static bool IsLower(string argText)
  203. {
  204. if (string.IsNullOrEmpty(argText)) return false;
  205. return Include(Constant.LowerCollection, argText, true, true);
  206. }
  207. /// <summary>验证字符串内所有字符是否均为易识别字符。</summary>
  208. public static bool IsLucid(string argText)
  209. {
  210. if (string.IsNullOrEmpty(argText)) return false;
  211. return Include(Constant.LucidCollection, argText, true, true);
  212. }
  213. }
  214. }