综合办公系统
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

StrUtil.js 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /**
  2. * 字符串工具类
  3. **/
  4. export const StrUtil = {
  5. /**
  6. * 字符串是否为空白 空白的定义如下: <br>
  7. * 1、为null <br>
  8. * 2、为不可见字符(如空格)<br>
  9. * 3、""<br>
  10. *
  11. * @param str 被检测的字符串
  12. * @return boolean 是否为空
  13. */
  14. isBlank: function (str) {
  15. return str === undefined || str == null || this.trim(str) === "";
  16. },
  17. /**
  18. * 字符串是否为非空白 空白的定义如下: <br>
  19. * 1、不为null <br>
  20. * 2、不为不可见字符(如空格)<br>
  21. * 3、不为""<br>
  22. *
  23. * @param str 被检测的字符串
  24. * @return boolean 是否为非空
  25. */
  26. isNotBlank: function (str) {
  27. // == 代表相同,=== 代表严格相同
  28. return false === StrUtil.isBlank(str);
  29. },
  30. /**
  31. * 字符串是否为空,空的定义如下:<br>
  32. * 1、为null <br>
  33. * 2、为""<br>
  34. *
  35. * @param str 被检测的字符串
  36. * @return boolean 是否为空
  37. */
  38. isEmpty: function (str) {
  39. return str == null || str === "";
  40. },
  41. /**
  42. * 字符串是否为非空白 空白的定义如下: <br>
  43. * 1、不为null <br>
  44. * 2、不为""<br>
  45. *
  46. * @param str 被检测的字符串
  47. * @return boolean 是否为非空
  48. */
  49. isNotEmpty: function (str) {
  50. return !StrUtil.isEmpty(str);
  51. },
  52. /**
  53. * 空对象转字符串
  54. *
  55. * @param str 被检查的字符串
  56. * @return string 原字符串或者空串
  57. */
  58. nullToStr: function (str) {
  59. if (StrUtil.isEmpty(str)) {
  60. return "";
  61. }
  62. return str;
  63. },
  64. /**
  65. * 空格截取
  66. *
  67. * @param str 截取的字符串
  68. * @return string
  69. */
  70. trim: function (str) {
  71. if (str == null) {
  72. return "";
  73. }
  74. return str.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
  75. },
  76. /**
  77. * 比较两个字符串(大小写敏感)
  78. *
  79. * @param str 字符串
  80. * @param that 比较的字符串
  81. * @return boolean
  82. */
  83. equals: function (str, that) {
  84. return str === that;
  85. },
  86. /**
  87. * 比较两个字符串(大小写不敏感)
  88. *
  89. * @param str 字符串
  90. * @param that 比较的字符串
  91. * @return boolean
  92. */
  93. equalsIgnoreCase: function (str, that) {
  94. return String(str).toUpperCase() === String(that).toUpperCase();
  95. },
  96. /**
  97. * 将字符串按指定字符分割
  98. *
  99. * @param str 字符串
  100. * @param sep 比较的字符串
  101. * @param maxLen 最大长度
  102. * @return string[] 分割后的数组
  103. */
  104. split: function (str, sep, maxLen) {
  105. if (StrUtil.isEmpty(str)) {
  106. return null;
  107. }
  108. const value = String(str).split(sep);
  109. return maxLen ? value.slice(0, maxLen - 1) : value;
  110. },
  111. /**
  112. * 字符串格式化(%s )
  113. *
  114. * @param str 字符串
  115. * @return 格式化后的字符串
  116. */
  117. sprintf: function (str) {
  118. let args = arguments, flag = true, i = 1;
  119. str = str.replace(/%s/g, function () {
  120. const arg = args[i++];
  121. if (typeof arg === 'undefined') {
  122. flag = false;
  123. return '';
  124. }
  125. return arg;
  126. });
  127. return flag ? str : '';
  128. },
  129. /**
  130. * 判断字符串是否是以start开头
  131. *
  132. * @param str 字符串
  133. * @param start 开始的字符串
  134. * @return boolean
  135. */
  136. startWith: function (str, start) {
  137. const reg = new RegExp("^" + start);
  138. return reg.test(str);
  139. },
  140. /**
  141. * 判断字符串是否是以end结尾
  142. *
  143. * @param str 字符串
  144. * @param end 结尾的字符串
  145. * @return boolean
  146. */
  147. endWith: function (str, end) {
  148. const reg = new RegExp(end + "$");
  149. return reg.test(str);
  150. },
  151. containsWhitespace: function (input) {
  152. return this.contains(input, ' ');
  153. },
  154. //生成指定个数的字符
  155. repeat: function (ch, repeatTimes) {
  156. let result = "";
  157. for (let i = 0; i < repeatTimes; i++) {
  158. result += ch;
  159. }
  160. return result;
  161. },
  162. deleteWhitespace: function (input) {
  163. return input.replace(/\s+/g, '');
  164. },
  165. rightPad: function (input, size, padStr) {
  166. return input + this.repeat(padStr, size);
  167. },
  168. leftPad: function (input, size, padStr) {
  169. return this.repeat(padStr, size) + input;
  170. },
  171. //首小写字母转大写
  172. capitalize: function (input) {
  173. let strLen = 0;
  174. if (input == null || (strLen = input.length) === 0) {
  175. return input;
  176. }
  177. return input.replace(/^[a-z]/, function (matchStr) {
  178. return matchStr.toLocaleUpperCase();
  179. });
  180. },
  181. //首大写字母转小写
  182. uncapitalize: function (input) {
  183. let strLen = 0;
  184. if (input == null || (strLen = input.length) === 0) {
  185. return input;
  186. }
  187. return input.replace(/^[A-Z]/, function (matchStr) {
  188. return matchStr.toLocaleLowerCase();
  189. });
  190. },
  191. //大写转小写,小写转大写
  192. swapCase: function (input) {
  193. return input.replace(/[a-z]/ig, function (matchStr) {
  194. if (matchStr >= 'A' && matchStr <= 'Z') {
  195. return matchStr.toLocaleLowerCase();
  196. } else if (matchStr >= 'a' && matchStr <= 'z') {
  197. return matchStr.toLocaleUpperCase();
  198. }
  199. });
  200. },
  201. //统计含有的子字符串的个数
  202. countMatches: function (input, sub) {
  203. if (this.isEmpty(input) || this.isEmpty(sub)) {
  204. return 0;
  205. }
  206. let count = 0;
  207. let index = 0;
  208. while ((index = input.indexOf(sub, index)) !== -1) {
  209. index += sub.length;
  210. count++;
  211. }
  212. return count;
  213. },
  214. //只包含字母
  215. isAlpha: function (input) {
  216. return /^[a-z]+$/i.test(input);
  217. },
  218. //只包含字母、空格
  219. isAlphaSpace: function (input) {
  220. return /^[a-z\s]*$/i.test(input);
  221. },
  222. //只包含字母、数字
  223. isAlphanumeric: function (input) {
  224. return /^[a-z0-9]+$/i.test(input);
  225. },
  226. //只包含字母、数字和空格
  227. isAlphanumericSpace: function (input) {
  228. return /^[a-z0-9\s]*$/i.test(input);
  229. },
  230. //数字
  231. isNumeric: function (input) {
  232. return /^(?:[1-9]\d*|0)(?:\.\d+)?$/.test(input);
  233. },
  234. //小数
  235. isDecimal: function (input) {
  236. return /^[-+]?(?:0|[1-9]\d*)\.\d+$/.test(input);
  237. },
  238. //负小数
  239. isNegativeDecimal: function (input) {
  240. return /^\-?(?:0|[1-9]\d*)\.\d+$/.test(input);
  241. },
  242. //正小数
  243. isPositiveDecimal: function (input) {
  244. return /^\+?(?:0|[1-9]\d*)\.\d+$/.test(input);
  245. },
  246. //整数
  247. isInteger: function (input) {
  248. return /^[-+]?(?:0|[1-9]\d*)$/.test(input);
  249. },
  250. //正整数
  251. isPositiveInteger: function (input) {
  252. return /^\+?(?:0|[1-9]\d*)$/.test(input);
  253. },
  254. //负整数
  255. isNegativeInteger: function (input) {
  256. return /^\-?(?:0|[1-9]\d*)$/.test(input);
  257. },
  258. //只包含数字和空格
  259. isNumericSpace: function (input) {
  260. return /^[\d\s]*$/.test(input);
  261. },
  262. isWhitespace: function (input) {
  263. return /^\s*$/.test(input);
  264. },
  265. isAllLowerCase: function (input) {
  266. return /^[a-z]+$/.test(input);
  267. },
  268. isAllUpperCase: function (input) {
  269. return /^[A-Z]+$/.test(input);
  270. },
  271. defaultString: function (input, defaultStr) {
  272. return input == null ? defaultStr : input;
  273. },
  274. defaultIfBlank: function (input, defaultStr) {
  275. return this.isBlank(input) ? defaultStr : input;
  276. },
  277. defaultIfEmpty: function (input, defaultStr) {
  278. return this.isEmpty(input) ? defaultStr : input;
  279. },
  280. //字符串反转
  281. reverse: function (input) {
  282. if (this.isBlank(input)) {
  283. input;
  284. }
  285. return input.split("").reverse().join("");
  286. },
  287. //删掉特殊字符(英文状态下)
  288. removeSpecialCharacter: function (input) {
  289. return input.replace(/[!-/:-@\[-`{-~]/g, "");
  290. },
  291. //只包含特殊字符、数字和字母(不包括空格,若想包括空格,改为[ -~])
  292. isSpecialCharacterAlphanumeric: function (input) {
  293. return /^[!-~]+$/.test(input);
  294. },
  295. /**
  296. * 校验时排除某些字符串,即不能包含某些字符串
  297. * @param {Object} conditions:里面有多个属性,如下:
  298. *
  299. * @param {String} matcherFlag 匹配标识
  300. * 0:数字;1:字母;2:小写字母;3:大写字母;4:特殊字符,指英文状态下的标点符号及括号等;5:中文;
  301. * 6:数字和字母;7:数字和小写字母;8:数字和大写字母;9:数字、字母和特殊字符;10:数字和中文;
  302. * 11:小写字母和特殊字符;12:大写字母和特殊字符;13:字母和特殊字符;14:小写字母和中文;15:大写字母和中文;
  303. * 16:字母和中文;17:特殊字符、和中文;18:特殊字符、字母和中文;19:特殊字符、小写字母和中文;20:特殊字符、大写字母和中文;
  304. * 100:所有字符;
  305. * @param {Array} excludeStrArr 排除的字符串,数组格式
  306. * @param {String} length 长度,可为空。1,2表示长度1到2之间;10,表示10个以上字符;5表示长度为5
  307. * @param {Boolean} ignoreCase 是否忽略大小写
  308. * conditions={matcherFlag:"0",excludeStrArr:[],length:"",ignoreCase:true}
  309. */
  310. isPatternMustExcludeSomeStr: function (input, conditions) {
  311. //参数
  312. const matcherFlag = conditions.matcherFlag;
  313. const excludeStrArr = conditions.excludeStrArr;
  314. const length = conditions.length;
  315. const ignoreCase = conditions.ignoreCase;
  316. //拼正则
  317. const size = excludeStrArr.length;
  318. let regex = (size === 0) ? "^" : "^(?!.*(?:{0}))";
  319. let subPattern = "";
  320. for (let i = 0; i < size; i++) {
  321. excludeStrArr[i] = Bee.StringUtils.escapeMetacharacterOfStr(excludeStrArr[i]);
  322. subPattern += excludeStrArr[i];
  323. if (i !== size - 1) {
  324. subPattern += "|";
  325. }
  326. }
  327. regex = this.format(regex, [subPattern]);
  328. switch (matcherFlag) {
  329. case '0':
  330. regex += "\\d";
  331. break;
  332. case '1':
  333. regex += "[a-zA-Z]";
  334. break;
  335. case '2':
  336. regex += "[a-z]";
  337. break;
  338. case '3':
  339. regex += "[A-Z]";
  340. break;
  341. case '4':
  342. regex += "[!-/:-@\[-`{-~]";
  343. break;
  344. case '5':
  345. regex += "[\u4E00-\u9FA5]";
  346. break;
  347. case '6':
  348. regex += "[a-zA-Z0-9]";
  349. break;
  350. case '7':
  351. regex += "[a-z0-9]";
  352. break;
  353. case '8':
  354. regex += "[A-Z0-9]";
  355. break;
  356. case '9':
  357. regex += "[!-~]";
  358. break;
  359. case '10':
  360. regex += "[0-9\u4E00-\u9FA5]";
  361. break;
  362. case '11':
  363. regex += "[a-z!-/:-@\[-`{-~]";
  364. break;
  365. case '12':
  366. regex += "[A-Z!-/:-@\[-`{-~]";
  367. break;
  368. case '13':
  369. regex += "[a-zA-Z!-/:-@\[-`{-~]";
  370. break;
  371. case '14':
  372. regex += "[a-z\u4E00-\u9FA5]";
  373. break;
  374. case '15':
  375. regex += "[A-Z\u4E00-\u9FA5]";
  376. break;
  377. case '16':
  378. regex += "[a-zA-Z\u4E00-\u9FA5]";
  379. break;
  380. case '17':
  381. regex += "[\u4E00-\u9FA5!-/:-@\[-`{-~]";
  382. break;
  383. case '18':
  384. regex += "[\u4E00-\u9FA5!-~]";
  385. break;
  386. case '19':
  387. regex += "[a-z\u4E00-\u9FA5!-/:-@\[-`{-~]";
  388. break;
  389. case '20':
  390. regex += "[A-Z\u4E00-\u9FA5!-/:-@\[-`{-~]";
  391. break;
  392. case '100':
  393. regex += "[\s\S]";
  394. break;
  395. default:
  396. alert(matcherFlag + ":This type is not supported!");
  397. }
  398. regex += this.isNotBlank(length) ? "{" + length + "}" : "+";
  399. regex += "$";
  400. const pattern = new RegExp(regex, ignoreCase ? "i" : "");
  401. return pattern.test(input);
  402. },
  403. /**
  404. * @param {String} message
  405. * @param {Array} arr
  406. * 消息格式化
  407. */
  408. format: function (message, arr) {
  409. return message.replace(/{(\d+)}/g, function (matchStr, group1) {
  410. return arr[group1];
  411. });
  412. },
  413. /**
  414. * 把连续出现多次的字母字符串进行压缩。如输入:aaabbbbcccccd 输出:3a4b5cd
  415. * @param {String} input
  416. * @param {Boolean} ignoreCase : true or false
  417. */
  418. compressRepeatedStr: function (input, ignoreCase) {
  419. const pattern = new RegExp("([a-z])\\1+", ignoreCase ? "ig" : "g");
  420. return input.replace(pattern, function (matchStr, group1) {
  421. return matchStr.length + group1;
  422. });
  423. },
  424. /**
  425. * 校验必须同时包含某些字符串
  426. * @param {String} input
  427. * @param {Object} conditions:里面有多个属性,如下:
  428. *
  429. * @param {String} matcherFlag 匹配标识
  430. * 0:数字;1:字母;2:小写字母;3:大写字母;4:特殊字符,指英文状态下的标点符号及括号等;5:中文;
  431. * 6:数字和字母;7:数字和小写字母;8:数字和大写字母;9:数字、字母和特殊字符;10:数字和中文;
  432. * 11:小写字母和特殊字符;12:大写字母和特殊字符;13:字母和特殊字符;14:小写字母和中文;15:大写字母和中文;
  433. * 16:字母和中文;17:特殊字符、和中文;18:特殊字符、字母和中文;19:特殊字符、小写字母和中文;20:特殊字符、大写字母和中文;
  434. * 100:所有字符;
  435. * @param {Array} excludeStrArr 排除的字符串,数组格式
  436. * @param {String} length 长度,可为空。1,2表示长度1到2之间;10,表示10个以上字符;5表示长度为5
  437. * @param {Boolean} ignoreCase 是否忽略大小写
  438. * conditions={matcherFlag:"0",containStrArr:[],length:"",ignoreCase:true}
  439. *
  440. */
  441. isPatternMustContainSomeStr: function (input, conditions) {
  442. //参数
  443. const matcherFlag = conditions.matcherFlag;
  444. const containStrArr = conditions.containStrArr;
  445. const length = conditions.length;
  446. const ignoreCase = conditions.ignoreCase;
  447. //创建正则
  448. const size = containStrArr.length;
  449. let regex = "^";
  450. let subPattern = "";
  451. for (let i = 0; i < size; i++) {
  452. containStrArr[i] = Bee.StringUtils.escapeMetacharacterOfStr(containStrArr[i]);
  453. subPattern += "(?=.*" + containStrArr[i] + ")";
  454. }
  455. regex += subPattern;
  456. switch (matcherFlag) {
  457. case '0':
  458. regex += "\\d";
  459. break;
  460. case '1':
  461. regex += "[a-zA-Z]";
  462. break;
  463. case '2':
  464. regex += "[a-z]";
  465. break;
  466. case '3':
  467. regex += "[A-Z]";
  468. break;
  469. case '4':
  470. regex += "[!-/:-@\[-`{-~]";
  471. break;
  472. case '5':
  473. regex += "[\u4E00-\u9FA5]";
  474. break;
  475. case '6':
  476. regex += "[a-zA-Z0-9]";
  477. break;
  478. case '7':
  479. regex += "[a-z0-9]";
  480. break;
  481. case '8':
  482. regex += "[A-Z0-9]";
  483. break;
  484. case '9':
  485. regex += "[!-~]";
  486. break;
  487. case '10':
  488. regex += "[0-9\u4E00-\u9FA5]";
  489. break;
  490. case '11':
  491. regex += "[a-z!-/:-@\[-`{-~]";
  492. break;
  493. case '12':
  494. regex += "[A-Z!-/:-@\[-`{-~]";
  495. break;
  496. case '13':
  497. regex += "[a-zA-Z!-/:-@\[-`{-~]";
  498. break;
  499. case '14':
  500. regex += "[a-z\u4E00-\u9FA5]";
  501. break;
  502. case '15':
  503. regex += "[A-Z\u4E00-\u9FA5]";
  504. break;
  505. case '16':
  506. regex += "[a-zA-Z\u4E00-\u9FA5]";
  507. break;
  508. case '17':
  509. regex += "[\u4E00-\u9FA5!-/:-@\[-`{-~]";
  510. break;
  511. case '18':
  512. regex += "[\u4E00-\u9FA5!-~]";
  513. break;
  514. case '19':
  515. regex += "[a-z\u4E00-\u9FA5!-/:-@\[-`{-~]";
  516. break;
  517. case '20':
  518. regex += "[A-Z\u4E00-\u9FA5!-/:-@\[-`{-~]";
  519. break;
  520. case '100':
  521. regex += "[\s\S]";
  522. break;
  523. default:
  524. alert(matcherFlag + ":This type is not supported!");
  525. }
  526. regex += this.isNotBlank(length) ? "{" + length + "}" : "+";
  527. regex += "$";
  528. const pattern = new RegExp(regex, ignoreCase ? "i" : "");
  529. return pattern.test(input);
  530. },
  531. //中文校验
  532. isChinese: function (input) {
  533. return /^[\u4E00-\u9FA5]+$/.test(input);
  534. },
  535. //去掉中文字符
  536. removeChinese: function (input) {
  537. return input.replace(/[\u4E00-\u9FA5]+/gm, "");
  538. },
  539. //转义元字符
  540. escapeMetacharacter: function (input) {
  541. const metacharacter = "^$()*+.[]|\\-?{}|";
  542. if (metacharacter.indexOf(input) >= 0) {
  543. input = "\\" + input;
  544. }
  545. return input;
  546. },
  547. //转义字符串中的元字符
  548. escapeMetacharacterOfStr: function (input) {
  549. return input.replace(/[\^\$\*\+\.\|\\\-\?\{\}\|]/gm, "\\$&");
  550. }
  551. };