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.

284 lines
11 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>判断对象为 Null、空字符串或空白字符串。</summary>
  124. public static bool IsEmpty(string argText)
  125. {
  126. if (argText == null) return true;
  127. if (argText.Length == 0) return true;
  128. for (int i = 0; i < argText.Length; i++) if (argText[i] != ' ') return false;
  129. return true;
  130. }
  131. /// <summary>判断字符为空。</summary>
  132. public static bool IsBlank(char argChar, bool argIncludeSbcCase = false)
  133. {
  134. if (Constant.BlankDbcCaseChars.IndexOf(argChar) >= 0) return true;
  135. if (argIncludeSbcCase && Constant.BlankSbcCaseChars.IndexOf(argChar) >= 0) return true;
  136. return false;
  137. }
  138. /// <summary>判断对象为 Null、空字符串或无实际内容的字符串。</summary>
  139. public static bool IsBlank(string argText, bool argIncludeSbcCase = false)
  140. {
  141. if (argText == null) return true;
  142. if (argText.Length == 0) return true;
  143. for (int i = 0; i < argText.Length; i++)
  144. {
  145. if (IsBlank(argText[i], argIncludeSbcCase)) continue;
  146. return false;
  147. }
  148. return true;
  149. }
  150. /// <summary>验证字符串内容是否为 IP v4 地址,格式为“0.0.0.0”。</summary>
  151. public static bool IsIP(string argIp)
  152. {
  153. if (string.IsNullOrEmpty(argIp)) return false;
  154. try
  155. {
  156. string[] va;
  157. va = TextUtility.Split(argIp, '.');
  158. if (va.Length != 4) return false;
  159. for (int i = 0; i <= 3; i++)
  160. {
  161. if (!IsInteger(va[i])) return false;
  162. int vint = System.Convert.ToInt32(va[i]);
  163. if (vint < 0) return false;
  164. if (vint > 255) return false;
  165. }
  166. return true;
  167. }
  168. catch
  169. {
  170. return false;
  171. }
  172. }
  173. ///<summary>验证字符串内容是否为数字,包含整数和小数。</summary>
  174. public static bool IsNumber(string argText)
  175. {
  176. if (IsInteger(argText)) return true;
  177. if (IsDecimal(argText)) return true;
  178. return false;
  179. }
  180. /// <summary>验证字符串内容是否为整数。</summary>
  181. public static bool IsInteger(string argText)
  182. {
  183. //try
  184. {
  185. if (string.IsNullOrEmpty(argText)) return false;
  186. string vtext = argText.Trim();
  187. if (string.IsNullOrEmpty(vtext)) return false;
  188. if (vtext.StartsWith("-")) vtext = TextHelper.Mid(vtext, 2, TextHelper.Len(vtext) - 1);
  189. return Include(Constant.NumberCollection, vtext, true);
  190. }
  191. // catch { return false; }
  192. }
  193. /// <summary>验证字符串内容是否为小数,格式:0.0。</summary>
  194. public static bool IsDecimal(string argText)
  195. {
  196. // try
  197. {
  198. string vtext = argText.Trim();
  199. if (string.IsNullOrEmpty(vtext)) return false;
  200. string[] va;
  201. va = TextUtility.Split(vtext, '.');
  202. if (va.Length == 2)
  203. {
  204. for (int vi = 0; vi <= 1; vi++) if (!IsInteger(va[vi])) return false;
  205. return true;
  206. }
  207. return false;
  208. }
  209. // catch { return false; }
  210. }
  211. /// <summary>验证字符串内所有字符是否均为十六进制字符。</summary>
  212. public static bool IsHex(string argText)
  213. {
  214. return Include(Constant.HexCollection, argText, true, true);
  215. }
  216. /// <summary>验证字符串是否为 GUID。</summary>
  217. public static bool IsGuid(string argText)
  218. {
  219. try
  220. {
  221. string vtext = argText.Trim();
  222. if (string.IsNullOrEmpty(vtext)) return false;
  223. vtext = TextModifier.Replace(vtext, "-", "");
  224. if (TextHelper.Len(vtext) == 32) return IsHex(vtext);
  225. }
  226. catch { }
  227. return false;
  228. }
  229. /// <summary>验证字节数组是否为 16 字节。</summary>
  230. public static bool IsGuid(string[] argBytes)
  231. {
  232. if (argBytes == null) return false;
  233. return (argBytes.Length == 16) ? true : false;
  234. }
  235. /// <summary>验证字符串内所有字符是否均为字母。</summary>
  236. public static bool IsLetter(string argText)
  237. {
  238. if (string.IsNullOrEmpty(argText)) return false;
  239. return Include(Constant.LetterCollection, argText, true, false);
  240. }
  241. /// <summary>验证字符串内所有字符是否均为大写字母。</summary>
  242. public static bool IsUpper(string argText)
  243. {
  244. if (string.IsNullOrEmpty(argText)) return false;
  245. return Include(Constant.UpperCollection, argText, true, true);
  246. }
  247. /// <summary>验证字符串内所有字符是否均为小写字母。</summary>
  248. public static bool IsLower(string argText)
  249. {
  250. if (string.IsNullOrEmpty(argText)) return false;
  251. return Include(Constant.LowerCollection, argText, true, true);
  252. }
  253. /// <summary>验证字符串内所有字符是否均为易识别字符。</summary>
  254. public static bool IsLucid(string argText)
  255. {
  256. if (string.IsNullOrEmpty(argText)) return false;
  257. return Include(Constant.LucidCollection, argText, true, true);
  258. }
  259. }
  260. }