StringUtils.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  1. package com.mixsmart.utils;
  2. import com.bstek.ureport.console.designer.ReportUtils;
  3. import com.jfirer.baseutil.encrypt.Md5Util;
  4. import com.mixsmart.constant.IMixConstant;
  5. import com.mixsmart.exception.NullArgumentException;
  6. import org.springblade.core.tool.utils.StringPool;
  7. import java.io.UnsupportedEncodingException;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.Modifier;
  10. import java.math.BigDecimal;
  11. import java.text.DecimalFormat;
  12. import java.text.SimpleDateFormat;
  13. import java.util.*;
  14. import java.util.regex.Matcher;
  15. import java.util.regex.Pattern;
  16. import java.util.stream.Collectors;
  17. /**
  18. * @version 1.0
  19. * @Description:字符串处理工具类
  20. * @author:rock
  21. * @time:2020年4月21日 下午12:05:04
  22. */
  23. public class StringUtils {
  24. private StringUtils() {
  25. throw new UnsupportedOperationException("StringUtils类无法实例化");
  26. }
  27. private static final String CHARSET_NAME = "UTF-8";
  28. /**
  29. * 判断是否为空
  30. *
  31. * @param value 内容
  32. * @return 为空返回:true;否则返回:false
  33. */
  34. public static boolean isEmpty(String value) {
  35. return (null == value || value.trim().length() == 0);
  36. }
  37. /**
  38. * @return boolean
  39. * @Description 批量判读为空
  40. * @Param [values]
  41. * @Author yangyj
  42. * @Date 2021.11.05 13:42
  43. **/
  44. public static boolean isEmpty(Object... values) {
  45. for (Object value : values) {
  46. if (!isEmpty(value)) {
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52. /**
  53. * 判断是否不为空
  54. *
  55. * @param value  内容
  56. * @return 不为空返回:true;否则返回:false
  57. */
  58. public static boolean isNotEmpty(String value) {
  59. return !isEmpty(value);
  60. }
  61. /**
  62. * 判断参数;如果参数<code>value</code> 为空;
  63. * 则抛出参数为空异常(运行时异常)
  64. *
  65. * @param value 需要判断的参数
  66. * @param msg 提示信息
  67. */
  68. public static void isAssert(Object value, String msg) {
  69. msg = isEmpty(msg) ? "提供的参数为空" : msg;
  70. if (null == value) {
  71. throw new NullArgumentException(msg);
  72. }
  73. if (value instanceof String) {
  74. if (isEmpty(value.toString())) {
  75. throw new NullArgumentException(msg);
  76. }
  77. } else if (value instanceof Collection) {
  78. if (CollectionUtils.isEmpty((Collection<?>) value)) {
  79. throw new NullArgumentException(msg);
  80. }
  81. } else if (value.getClass().isArray()) {
  82. if (ArrayUtils.isEmpty((Object[]) value)) {
  83. throw new NullArgumentException(msg);
  84. }
  85. }
  86. }
  87. /**
  88. * 判断值是否相等
  89. *
  90. * @param value1
  91. * @param value2
  92. * @return 相等返回:true;否则返回:false
  93. */
  94. public static boolean isEquals(Object value1, Object value2) {
  95. boolean is = false;
  96. if (null != value1 && null != value2) {
  97. is = value1.toString().equals(value2.toString());
  98. } else if (null == value1 && null == value2) {
  99. is = true;
  100. }
  101. return is;
  102. }
  103. /**
  104. * 判断值是否不相等
  105. *
  106. * @param value1
  107. * @param value2
  108. * @return 相等返回:true;否则返回:false
  109. */
  110. public static boolean isNotEquals(Object value1, Object value2) {
  111. return !isEquals(value1, value2);
  112. }
  113. /**
  114. * 判断值是否相等(不区分大小写)
  115. *
  116. * @param value1
  117. * @param value2
  118. * @return 相等返回:true;否则返回:false
  119. */
  120. public static boolean isEqualsIgnoreCase(Object value1, Object value2) {
  121. boolean is = false;
  122. if (null != value1 && null != value1) {
  123. is = value1.toString().equalsIgnoreCase(value2.toString());
  124. } else if (null == value1 && null == value1) {
  125. is = true;
  126. }
  127. return is;
  128. }
  129. /**
  130. * 判断值是否不相等(不区分大小写)
  131. *
  132. * @param value1
  133. * @param value2
  134. * @return 相等返回:true;否则返回:false
  135. */
  136. public static boolean isNotEqualsIgnoreCase(Object value1, Object value2) {
  137. return !isEqualsIgnoreCase(value1, value2);
  138. }
  139. /**
  140. * null转换为“”
  141. *
  142. * @param obj
  143. * @return 返回处理后的结果
  144. */
  145. public static String handleNull(Object obj) {
  146. if (null == obj) {
  147. return "";
  148. } else {
  149. return obj.toString().trim();
  150. }
  151. }
  152. /**
  153. * 当值为null转化为“null”
  154. *
  155. * @param obj
  156. * @return 返回处理后的结果
  157. */
  158. public static String nullToStr(Object obj) {
  159. if (null == obj) {
  160. return "null";
  161. } else {
  162. return obj.toString().trim();
  163. }
  164. }
  165. /**
  166. * 对象转化为整型
  167. * <p>注:该方法已过时,请用{@link #handleObj2Integer(Object)} 代替</p>
  168. *
  169. * @param obj
  170. * @return 返回转化结果
  171. */
  172. public static Integer handObj2Integer(Object obj) {
  173. return handleObj2Integer(obj);
  174. }
  175. /**
  176. * 对象转化为整型
  177. *
  178. * @param obj
  179. * @return 返回转化结果
  180. */
  181. public static Integer handleObj2Integer(Object obj) {
  182. if (null == obj) {
  183. return 0;
  184. } else {
  185. double value = 0;
  186. try {
  187. value = Double.parseDouble(obj.toString());
  188. } catch (Exception ex) {
  189. value = 0;
  190. }
  191. return (int) value;
  192. }
  193. }
  194. /**
  195. * @return java.lang.Double
  196. * @Description 对象转Double
  197. * @Param [obj, scale]
  198. * @Author yangyj
  199. * @Date 2022.04.20 14:15
  200. **/
  201. public static Double obj2Double(Object obj, Object scale) {
  202. if (StringUtils.isNumber(obj)) {
  203. if (StringUtils.isNumber(scale)) {
  204. obj = new BigDecimal(StringUtils.number2String(obj, scale));
  205. }
  206. BigDecimal big = new BigDecimal(obj.toString());
  207. return big.doubleValue();
  208. }
  209. return null;
  210. }
  211. public static Double obj2Double(Object obj) {
  212. return obj2Double(obj, null);
  213. }
  214. /**
  215. * 数字null转换为“0”
  216. *
  217. * @param obj
  218. * @return 返回转化结果
  219. */
  220. public static String handleNumNull(Object obj) {
  221. if (null == obj) {
  222. return "0";
  223. } else {
  224. return obj.toString().trim();
  225. }
  226. }
  227. /**
  228. * 判断是否为数字(包括小数)
  229. *
  230. * @param value
  231. * @return 数字返回:true;否则返回:false
  232. */
  233. public static boolean isNum(Object value) {
  234. boolean is = false;
  235. if (value != null) {
  236. Pattern pattern = Pattern.compile("\\d+|\\d+\\.\\d+");
  237. Matcher matcher = pattern.matcher(value.toString());
  238. if (matcher.matches()) {
  239. is = true;
  240. } else {
  241. is = false;
  242. }
  243. }
  244. return is;
  245. }
  246. /**
  247. * 判断是否数字整数
  248. *
  249. * @param value
  250. * @return 是返回:true;否则返回:false
  251. */
  252. public static boolean isInteger(String value) {
  253. boolean is = false;
  254. Pattern pattern = Pattern.compile("\\d+");
  255. if (null != value && value.length() > 1) {
  256. pattern = Pattern.compile("^[1-9]\\d+");
  257. }
  258. Matcher matcher = pattern.matcher(value);
  259. if (matcher.matches()) {
  260. is = true;
  261. } else {
  262. is = false;
  263. }
  264. return is;
  265. }
  266. /**
  267. * 判断是否小数
  268. *
  269. * @param value
  270. * @return 是返回:true;否则返回:false
  271. */
  272. public static boolean isDecimal(String value) {
  273. boolean is = false;
  274. Pattern pattern = Pattern.compile("\\d+\\.\\d+");
  275. Matcher matcher = pattern.matcher(value);
  276. if (matcher.matches()) {
  277. is = true;
  278. } else {
  279. is = false;
  280. }
  281. return is;
  282. }
  283. /**
  284. * 随机生成数
  285. *
  286. * @param num 要生成随机数的个数
  287. * @return 返回随机生成数
  288. */
  289. public static String randomNum(int num) {
  290. Random random = new Random();
  291. String numStr = "";
  292. for (int i = 0; i < num; i++) {
  293. numStr += random.nextInt(10);
  294. }
  295. return numStr;
  296. }
  297. /**
  298. * 按日期格式生成序列号
  299. *
  300. * @param dateFormaterStr 日期格式
  301. * @return 返回序列号
  302. */
  303. public static String createSerialNum(String dateFormaterStr) {
  304. String serialNum = null;
  305. if (isNotEmpty(dateFormaterStr)) {
  306. SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormaterStr);
  307. serialNum = dateFormatter.format(new Date());
  308. dateFormatter = null;
  309. }
  310. return serialNum;
  311. }
  312. /**
  313. * 生成UUID序列号
  314. *
  315. * @return 返回UUID
  316. */
  317. public static String uuid() {
  318. String value = UUID.randomUUID().toString();
  319. value = value.replaceAll("-", "");
  320. return value.substring(0, 28);
  321. }
  322. public static String uuid(int max) {
  323. String value = UUID.randomUUID().toString();
  324. value = value.replaceAll("-", "");
  325. return value.substring(0, max);
  326. }
  327. /**
  328. * 获取文件后缀
  329. *
  330. * @param fileName
  331. * @return 返回文件后缀
  332. */
  333. public static String getFileSuffix(String fileName) {
  334. int index = fileName.lastIndexOf(".");
  335. if (index != -1) {
  336. return fileName.substring(index + 1);
  337. }
  338. return "";
  339. }
  340. /**
  341. * 去掉文件后缀
  342. *
  343. * @param fileName
  344. * @return 返回文件后缀
  345. */
  346. public static String trimFileSuffix(String fileName) {
  347. return fileName.substring(0, fileName.lastIndexOf("."));
  348. }
  349. /**
  350. * 验证手机号码
  351. *
  352. * @param phoneNo
  353. * @return 验证成功返回:true;否则返回:false
  354. */
  355. public static boolean isPhoneNO(String phoneNo) {
  356. Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
  357. Matcher m = p.matcher(phoneNo);
  358. return m.matches();
  359. }
  360. /**
  361. * 验证固定电话号码
  362. *
  363. * @param tel
  364. * @return 验证成功返回:true;否则返回:false
  365. */
  366. public static boolean isFixedTelephone(String tel) {
  367. Pattern p = Pattern.compile("^[0][0-9]{2,3}-[2-9][0-9]{6,7}(-[0-9]{1,4})?");
  368. Matcher m = p.matcher(tel);
  369. return m.matches();
  370. }
  371. /**
  372. * 验证匿名
  373. *
  374. * @param anonymous
  375. * @return 验证成功返回:true;否则返回:false
  376. */
  377. public static boolean isAnonymous(String anonymous) {
  378. Pattern p = Pattern.compile("^[\\u4e00-\\u9fa5|A-Za-z]([\\w|\\u4e00-\\u9fa5]){1,7}$");
  379. Matcher m = p.matcher(anonymous);
  380. return m.matches();
  381. }
  382. /**
  383. * 验证汉字
  384. *
  385. * @param value
  386. * @return 验证成功返回:true;否则返回:false
  387. */
  388. public static boolean isChinese(String value) {
  389. Pattern p = Pattern.compile("^[\\u4E00-\\u9FFF]+$");
  390. Matcher m = p.matcher(value);
  391. boolean is = m.matches();
  392. return is;
  393. }
  394. /**
  395. * 验证正则表达式
  396. *
  397. * @param value
  398. * @return 验证成功返回:true;否则返回:false
  399. */
  400. public static boolean isCheckRegex(String value, String regex) {
  401. Pattern p = Pattern.compile(regex);
  402. Matcher m = p.matcher(value);
  403. boolean is = m.matches();
  404. return is;
  405. }
  406. /**
  407. * 验证QQ号码
  408. *
  409. * @param value
  410. * @return 验证成功返回:true;否则返回:false
  411. */
  412. public static boolean isQQ(String value) {
  413. Pattern p = Pattern.compile("^[1-9]\\d{6,11}$");
  414. Matcher m = p.matcher(value);
  415. return m.matches();
  416. }
  417. /**
  418. * 验证email
  419. *
  420. * @param email
  421. * @return 验证成功返回:true;否则返回:false
  422. */
  423. public static boolean isEmail(String email) {
  424. Pattern p = Pattern.compile("^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
  425. Matcher m = p.matcher(email);
  426. return m.matches();
  427. }
  428. /**
  429. * 秒转化为:HH:mm:SS格式
  430. *
  431. * @param second
  432. * @return 返回转化后的结果
  433. */
  434. public static String secondToHHMMSS(long second) {
  435. long h = 0, m = 0, s = 0, tmp = 0;
  436. if (second >= 3600) {
  437. h = second / 3600;
  438. tmp = second % 36000;
  439. if (tmp >= 60) {
  440. m = tmp / 60;
  441. s = tmp % 60;
  442. } else {
  443. s = tmp;
  444. }
  445. } else if (second >= 60) {
  446. m = second / 60;
  447. s = second % 60;
  448. } else {
  449. s = second;
  450. }
  451. return (h > 9 ? h : "0" + h) + ":" + (m > 9 ? m : "0" + m) + ":" + (s > 9 ? s : "0" + s);
  452. }
  453. /**
  454. * 过滤特殊字符
  455. *
  456. * @param params
  457. * @return 返回过滤后的结果
  458. */
  459. public static String filterSQLParams(String params) {
  460. if (!isEmpty(params)) {
  461. StringBuilder strBuilder = new StringBuilder();
  462. strBuilder.append("'|\"|update|delete|select|drop|insert|=|;|0x|\\(|\\)|\\s|\\*|\\?|\\%|\\$");
  463. strBuilder.append("|and|exec|execute|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or");
  464. strBuilder.append("|\\+|,|like'|table|from|grant|use|group_concat|column_name|information_schema.columns");
  465. strBuilder.append("|table_schema|union|where|order|by|count");
  466. strBuilder.append("|--|,|like|//|/|#");
  467. String params1 = params.toLowerCase();
  468. params1 = params1.replaceAll(strBuilder.toString(), "");
  469. if ("".equals(params1) && !"''".equals(params)) {
  470. params = params1;
  471. }
  472. params = params.replaceAll("&", "&amp");
  473. params = params.replaceAll("<", "&lt");
  474. params = params.replaceAll(">", "&gt");
  475. }
  476. return params;
  477. }
  478. /**
  479. * 根据regex分隔字符串
  480. * 然后用逗号","重组
  481. *
  482. * @param ids
  483. * @param regex
  484. * @return 返回处理后的结果
  485. */
  486. public static String splitIds(String ids, String regex) {
  487. String newIds = "";
  488. if (isNotEmpty(ids)) {
  489. String[] idsArr = ids.split(regex);
  490. for (int i = 0; i < idsArr.length; i++) {
  491. if (i != (idsArr.length - 1)) {
  492. newIds += "'" + idsArr[i] + "',";
  493. } else {
  494. newIds += "'" + idsArr[i] + "'";
  495. }
  496. }
  497. }
  498. return newIds;
  499. }
  500. /**
  501. * 计算出文件大小
  502. *
  503. * @param size
  504. * @return 返回处理后的结果;<br />
  505. * 格式为:"100 KB"或”100 M“或”100 G“
  506. */
  507. public static String fileSize(long size) {
  508. DecimalFormat df = new DecimalFormat("0.0#");
  509. long KB = 1024;
  510. long MB = KB * 1024;
  511. long GB = MB * 1024;
  512. String valueStr = null;
  513. if (size < 0) {
  514. valueStr = "0 KB";
  515. } else if (size < KB * 1024) {
  516. double value = (double) size / KB;
  517. valueStr = df.format(value) + " KB";
  518. } else if (size < MB * 1024) {
  519. double value = (double) size / MB;
  520. valueStr = df.format(value) + " M";
  521. } else {
  522. double value = (double) size / GB;
  523. valueStr = df.format(value) + " G";
  524. }
  525. df = null;
  526. return valueStr;
  527. }
  528. /**
  529. * 过滤目录结构(防止参数传递目录结构)
  530. *
  531. * @param value
  532. * @return 返回过滤后的结果
  533. */
  534. public static String filterFilePath(String value) {
  535. if (!StringUtils.isEmpty(value)) {
  536. value.replaceAll("\\.|/|\\\\\\\\|\\\\|:|%2F|%2E|25%|20%|%5C|60%|27%|%3A|%2A", "");
  537. }
  538. return value;
  539. }
  540. /**
  541. * 判断是否含有contain指定的值
  542. *
  543. * @param value
  544. * @param contain
  545. * @return 包含返回:true;否则返回:false
  546. */
  547. public static boolean isContains(String value, String contain) {
  548. boolean is = false;
  549. if (!isEmpty(value) && null != contain) {
  550. is = value.contains(contain) ? true : false;
  551. }
  552. return is;
  553. }
  554. /**
  555. * list转换为数组
  556. *
  557. * @param values
  558. * @return 返回转化结果
  559. */
  560. public static String[] list2Array(Collection<String> values) {
  561. String[] valueArray = null;
  562. if (null != values && values.size() > 0) {
  563. valueArray = new String[values.size()];
  564. values.toArray(valueArray);
  565. }
  566. return valueArray;
  567. }
  568. /**
  569. * 验证IP地址
  570. *
  571. * @param ip
  572. * @return 验证成功返回:true;否则返回:false
  573. */
  574. public static boolean checkIp(String ip) {
  575. boolean is = false;
  576. String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
  577. + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
  578. + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
  579. + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
  580. Pattern pattern = Pattern.compile(regex);
  581. Matcher matcher = pattern.matcher(ip);
  582. if (matcher.matches()) {
  583. is = true;
  584. }
  585. return is;
  586. }
  587. /**
  588. * 集合转换为字符串,字符串之间用separater提供的参数分隔
  589. *
  590. * @param values
  591. * @param separater
  592. * @return 返回处理后的结果
  593. */
  594. public static <T> String collection2String(Collection<T> values, String separater) {
  595. StringBuilder strBuilder = null;
  596. if (null != values && values.size() > 0) {
  597. strBuilder = new StringBuilder();
  598. if (isEmpty(separater)) {
  599. separater = "";
  600. }
  601. for (T value : values) {
  602. strBuilder.append(StringUtils.handleNull(value) + separater);
  603. }
  604. if (isNotEmpty(separater)) {
  605. strBuilder.delete(strBuilder.length() - 1, strBuilder.length());
  606. }
  607. }
  608. return strBuilder != null ? strBuilder.toString() : null;
  609. }
  610. /**
  611. * 替换多个空格、换行、回车、tab符等为一个空格
  612. *
  613. * @param value 预处理的字符串
  614. * @return 返回处理后的字符串
  615. */
  616. public static String removeMultiSpace(String value) {
  617. if (StringUtils.isNotEmpty(value)) {
  618. value = value.replaceAll("\\s+|\n|\r|\n|\t", " ");
  619. }
  620. return value;
  621. }
  622. /**
  623. * 替换特殊字符
  624. *
  625. * @param value 预处理的字符串
  626. * @return 返回处理后的结果
  627. */
  628. public static String repaceSpecialChar(String value) {
  629. if (isNotEmpty(value)) {
  630. value = value.replaceAll("\r|\n|\t", "");
  631. }
  632. return value;
  633. }
  634. public static String changeQuotation(String value) {
  635. if (isNotEmpty(value)) {
  636. value = value.replaceAll("'", "\\\\u0027");
  637. }
  638. return value;
  639. }
  640. /**
  641. * 替换斜杠
  642. *
  643. * @param value
  644. * @return 返回处理后的结果
  645. */
  646. public static String repaceSlash(String value) {
  647. if (isNotEmpty(value)) {
  648. //value = value.replaceAll("\\\\", "\\\\\\\\\\\\\\\\");
  649. value = value.replaceAll("\\\\", "\\\\\\\\");
  650. value = value.replaceAll("`", "\\\\`");
  651. value = value.replaceAll("'", "\\\\`");
  652. }
  653. return value;
  654. }
  655. /**
  656. * 替换斜杠
  657. *
  658. * @param value
  659. * @return 返回处理后的结果
  660. */
  661. public static String repaceSlashCopyTable(String value) {
  662. if (isNotEmpty(value)) {
  663. //value = value.replaceAll("\\\\", "\\\\\\\\\\\\\\\\");
  664. //value = value.replaceAll("\\\\", "\\\\\\\\");
  665. value = value.replaceAll("`", "\\\\`");
  666. }
  667. return value;
  668. }
  669. /**
  670. * 去空格
  671. *
  672. * @param value
  673. * @return 返回处理后的结果
  674. */
  675. public static String repaceBlank(String value) {
  676. if (isNotEmpty(value)) {
  677. value = value.replaceAll("\\s", "");
  678. }
  679. return value;
  680. }
  681. /**
  682. * 字符串转换为list
  683. *
  684. * @param value 要转换的字符串
  685. * @param separater 分隔符
  686. * @return 返回转换后的List
  687. */
  688. public static List<String> string2List(String value, String separater) {
  689. List<String> lists = null;
  690. if (isNotEmpty(value)) {
  691. separater = isEmpty(separater) ? "," : separater;
  692. String[] array = value.split(separater);
  693. lists = Arrays.asList(array);
  694. }
  695. return lists;
  696. }
  697. /**
  698. * 字符串转换为Set
  699. *
  700. * @param value 要转换的字符串
  701. * @param separater 分隔符
  702. * @return 返回转换后的Set
  703. */
  704. public static Set<String> string2Set(String value, String separater) {
  705. Set<String> sets = null;
  706. if (isNotEmpty(value)) {
  707. separater = isEmpty(separater) ? "," : separater;
  708. String[] array = value.split(separater);
  709. sets = new HashSet<String>();
  710. sets.addAll(Arrays.asList(array));
  711. }
  712. return sets;
  713. }
  714. /**
  715. * 如果值为空“”转换为NULL
  716. *
  717. * @param value
  718. * @return
  719. */
  720. public static String empty2Null(String value) {
  721. return isEmpty(value) ? null : value;
  722. }
  723. /**
  724. * 移除多值,只获取第一个值;多值之间通过英文逗号分隔
  725. *
  726. * @param value 需要处理的值
  727. * @return 返回处理后的值
  728. */
  729. public static String removeMultiValue(String value) {
  730. if (isEmpty(value)) {
  731. return value;
  732. }
  733. int p = value.indexOf(IMixConstant.MULTI_VALUE_SPLIT);
  734. if (p >= 0) {
  735. value = value.substring(0, p);
  736. }
  737. return value;
  738. }
  739. /**
  740. * 数组转化为字符串;
  741. * 如果<code>separate</code>为空,则采用默认值;默认值为:{@link IMixConstant#MULTI_VALUE_SPLIT}
  742. *
  743. * @param objs 数组
  744. * @param separate 分隔符
  745. * @return 返回数组转化成功后的字符串;失败返回:null
  746. */
  747. public static String arrayToString(Object[] objs, String separate) {
  748. StringBuilder strBuff = null;
  749. if (null == objs || objs.length == 0) {
  750. return null;
  751. }
  752. if (StringUtils.isEmpty(separate)) {
  753. separate = IMixConstant.MULTI_VALUE_SPLIT;
  754. }
  755. strBuff = new StringBuilder();
  756. for (int i = 0; i < objs.length; i++) {
  757. if (i < objs.length - 1) {
  758. strBuff.append(String.valueOf(objs[i]) + separate);
  759. } else {
  760. strBuff.append(String.valueOf(objs[i]));
  761. }
  762. }//for
  763. objs = null;
  764. return (null != strBuff) ? strBuff.toString() : null;
  765. }
  766. /**
  767. * 字符串转化为数组;
  768. * 如果<code>separate</code>为空,则采用默认值;默认值为:{@link IMixConstant#MULTI_VALUE_SPLIT}
  769. *
  770. * @param value 原字符串
  771. * @param separate 分隔符
  772. * @return 返回字符串分割成功后的数组
  773. */
  774. public static String[] stringToArray(String value, String separate) {
  775. String[] array = null;
  776. if (isEmpty(separate)) {
  777. separate = IMixConstant.MULTI_VALUE_SPLIT;
  778. }
  779. if (isNotEmpty(value)) {
  780. array = value.split(separate);
  781. }
  782. value = null;
  783. return array;
  784. }
  785. /**
  786. * 按separate分离成数组,判断该数组里面是否包含subStr;
  787. * 如果<code>separate</code>为空,则采用默认值;默认值为:{@link IMixConstant#MULTI_VALUE_SPLIT}
  788. *
  789. * @param str 字符串
  790. * @param subStr 子字符串
  791. * @param separate 分隔符
  792. * @return 包含返回:true;否则返回:false
  793. */
  794. public static boolean isArrayContains(String str, String subStr, String separate) {
  795. if (isEmpty(str)) {
  796. return isEmpty(subStr);
  797. }
  798. if (null == subStr) {
  799. return true;
  800. }
  801. boolean is = false;
  802. if (isEmpty(separate)) {
  803. separate = IMixConstant.MULTI_VALUE_SPLIT;
  804. }
  805. String[] strArray = str.split(separate);
  806. for (int i = 0; i < strArray.length; i++) {
  807. if (subStr.equals(strArray[i].trim())) {
  808. is = true;
  809. break;
  810. }
  811. }//for
  812. return is;
  813. }
  814. /**
  815. * 判断对象是否为空,或转换为字符串后的值是否为空
  816. *
  817. * @param value 需要判断的值
  818. * @return 为空(null或“”)返回true;否则返回false
  819. */
  820. public static boolean isEmpty(Object value) {
  821. if (null == value) {
  822. return true;
  823. } else {
  824. return isEmpty(handleNull(value));
  825. }
  826. }
  827. /**
  828. * 判断对象是否不为空;
  829. *
  830. * @param value 需要判断的值
  831. * @return 如果不为空返回true;否则返回false
  832. */
  833. public static boolean isNotEmpty(Object value) {
  834. return !isEmpty(value);
  835. }
  836. /**
  837. * @return boolean
  838. * @Description 批量非空校验
  839. * @Param [values]
  840. * @Author yangyj
  841. * @Date 2021.10.19 17:04
  842. **/
  843. public static boolean isNotEmpty(Object... values) {
  844. for (Object value : values) {
  845. if (isEmpty(value)) {
  846. return false;
  847. }
  848. }
  849. return true;
  850. }
  851. /**
  852. * @Description 是否数字
  853. * @Param [value]
  854. * @return boolean
  855. * @Author yangyj
  856. * @Date 2022.06.02 14:54
  857. **/
  858. public static boolean isNumber(Object value) {
  859. if (isEmpty(value)) {
  860. return false;
  861. }
  862. if (value instanceof Number) {
  863. return true;
  864. }
  865. String pattern = "^[+-]?\\d+(\\.\\d+)?$";
  866. Pattern r = Pattern.compile(pattern);
  867. Matcher m = r.matcher(String.valueOf(value));
  868. return m.matches();
  869. }
  870. public static boolean isDouble(Object value) {
  871. return isNumber(value) && value.toString().contains(".");
  872. }
  873. /**
  874. * @return java.util.Map<java.lang.String, java.lang.Object>
  875. * @Description
  876. * @Param [obj] 对象转成map集合
  877. * @Author yangyj
  878. * @Date 2021.05.27 14:33
  879. **/
  880. public static Map<String, Object> objectToMap(Object obj) {
  881. Map<String, Object> map = new HashMap<String, Object>();
  882. try {
  883. Class<?> clazz = obj.getClass();
  884. for (Field field : clazz.getDeclaredFields()) {
  885. field.setAccessible(true);
  886. if (Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers())) {
  887. continue;
  888. }
  889. String fieldName = field.getName();
  890. Object data = field.get(obj);
  891. Object toStrValue = handleNull(data);
  892. if (isNotEmpty(toStrValue)) {
  893. if (data.getClass().isArray()) {
  894. if (ArrayUtils.isNotEmpty((String[]) data)) {
  895. map.put(fieldName, data);
  896. }
  897. } else {
  898. map.put(fieldName, data);
  899. }
  900. }
  901. }
  902. } catch (Exception e) {
  903. e.printStackTrace();
  904. }
  905. return map;
  906. }
  907. /**
  908. * @Description 包含空字段
  909. * @Param [obj] 对象转成map集合
  910. * @return java.util.Map<java.lang.String, java.lang.Object>
  911. * @Author yangyj
  912. * @Date 2021.05.27 14:33
  913. **/
  914. // public static Map<String, Object> objectToMapNull(Object obj) {
  915. // Map<String, Object> map = new HashMap<String,Object>();
  916. // try {
  917. // Class<?> clazz = obj.getClass();
  918. // for (Field field : clazz.getDeclaredFields()) {
  919. // field.setAccessible(true);
  920. // if(Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers())) {
  921. // continue;
  922. // }
  923. // String fieldName = field.getName();
  924. // Object data =field.get(obj);
  925. // Object toStrValue = handleNull(data);
  926. // if(isNotEmpty(toStrValue)&&data.getClass().isArray()){
  927. // if(ArrayUtils.isNotEmpty((String[])data)){
  928. // map.put(fieldName,data);
  929. // }
  930. // }else if(isNotEmpty(toStrValue)&&data instanceof Date){
  931. // map.put(fieldName, DateUtil.dateToStr((Date) data,"yyyy-MM-dd HH:mm:ss"));
  932. // }else {
  933. // map.put(fieldName,toStrValue);
  934. // }
  935. // }
  936. // }catch (Exception e){
  937. // e.printStackTrace();
  938. // }
  939. // return map;
  940. // }
  941. /**
  942. * @return java.lang.String
  943. * @Description 返回字符串后n个字符
  944. * @Param [str, n]
  945. * @Author yangyj
  946. * @Date 2021.08.06 16:31
  947. **/
  948. public static String tail(String str, int n) {
  949. if (isNotEmpty(str) && str.length() >= n) {
  950. return str.substring(str.length() - n);
  951. } else {
  952. return str;
  953. }
  954. }
  955. /**
  956. * @return java.lang.String
  957. * @Description list转字符串
  958. * @Param [list, split:分隔符]
  959. * @Author yangyj
  960. * @Date 2021.08.06 17:11
  961. **/
  962. public static String join(List<String> list, String split) {
  963. StringBuilder sb = new StringBuilder("");
  964. if (ListUtils.isNotEmpty(list)) {
  965. for (String str : list) {
  966. if (StringUtils.isNotEmpty(str)) {
  967. sb.append(str).append(split);
  968. }
  969. }
  970. if (sb.length() > 0 && isNotEmpty(split)) {
  971. sb.delete(sb.length() - split.length(), sb.length());
  972. }
  973. }
  974. return sb.toString();
  975. }
  976. public static String join(List<String> list) {
  977. return join(list, null);
  978. }
  979. public static String join(Object... args) {
  980. if (args != null) {
  981. if (args.length > 2) {
  982. List<String> list = Arrays.stream(args).limit(args.length - 1).map(StringUtils::handleNull).collect(Collectors.toList());
  983. String split = handleNull(args[args.length - 1]);
  984. return join(list, split);
  985. } else {
  986. return handleNull(args[0]);
  987. }
  988. } else {
  989. return "";
  990. }
  991. }
  992. /**
  993. * @Description 获取实体映射所有表字段名
  994. * @Param [clazz]
  995. * @return java.util.List<java.lang.String>
  996. * @Author yangyj
  997. * @Date 2021.08.18 11:05
  998. **/
  999. // public static Map<String,String> getFiledAnnotate(Class<?> clazz) {
  1000. // LinkedHashMap<String,String> names = new LinkedHashMap<>();
  1001. // Field[] fields = clazz.getDeclaredFields();
  1002. // Method[] methods=clazz.getMethods();
  1003. // for (Field field:fields) {
  1004. // field.setAccessible(true);
  1005. // if(field.isAnnotationPresent(Column.class)) {
  1006. // names.put(field.getDeclaredAnnotation(Column.class).name(),isEquals(field.getType().toString(),String.class)?"''":"null");
  1007. // }
  1008. // }
  1009. // for (Method m:methods) {
  1010. // m.setAccessible(true);
  1011. // if(m.isAnnotationPresent(Column.class)) {
  1012. // names.put(m.getDeclaredAnnotation(Column.class).name(),isEquals(m.getReturnType().toString(),String.class)?"''":"null");
  1013. // }
  1014. // }
  1015. // return names;
  1016. // }
  1017. /**
  1018. * @return java.lang.String
  1019. * @Description 只查询出指定字段内容
  1020. * @Param [clazz, fields]
  1021. * @Author yangyj
  1022. * @Date 2021.08.18 11:18
  1023. **/
  1024. // public static String selectFieldsBuilder(Class<?>clazz,String ...fields){
  1025. // StringBuilder sb = new StringBuilder();
  1026. // Map<String,String> fieldsNames=getFiledAnnotate(clazz);
  1027. // if(MapUtils.isNotEmpty(fieldsNames)){
  1028. // if(ArrayUtils.isEmpty(fields)){
  1029. // sb.append(" * ");
  1030. // }else{
  1031. // HashSet<String> keys = new HashSet<>(Arrays.asList(fields));
  1032. // for(Map.Entry<String,String> entry:fieldsNames.entrySet()){
  1033. // if(!keys.contains(entry.getKey())){
  1034. // sb.append(entry.getValue()).append(" as ");
  1035. // }
  1036. // sb.append(entry.getKey()).append(",");
  1037. // }
  1038. // if(sb.lastIndexOf(",")==sb.length()-1){
  1039. // sb.deleteCharAt(sb.length()-1);
  1040. // }
  1041. // }
  1042. // }
  1043. // return sb.toString();
  1044. // }
  1045. public static String toString(byte[] bytes) {
  1046. try {
  1047. return new String(bytes, CHARSET_NAME);
  1048. } catch (UnsupportedEncodingException e) {
  1049. return "";
  1050. }
  1051. }
  1052. /**
  1053. * @return java.lang.String
  1054. * @Description 返回保留指定小数位数字字符串
  1055. * @Param [number, scale]
  1056. * @Author yangyj
  1057. * @Date 2021.10.15 10:35
  1058. **/
  1059. public static String number2StringZero(Object number, Object scale) {
  1060. if (isNumber(number)) {
  1061. if (isEmpty(scale)) {
  1062. scale = 0;
  1063. }
  1064. return new BigDecimal(handleNull(number)).setScale(handleObj2Integer(scale), BigDecimal.ROUND_HALF_UP).toString();
  1065. }
  1066. return "";
  1067. }
  1068. public static String number2String(Object number, Object scale) {
  1069. if (isNumber(number)) {
  1070. if (isEmpty(scale)) {
  1071. scale = 0;
  1072. }
  1073. String val = new BigDecimal(handleNull(number)).setScale(handleObj2Integer(scale), BigDecimal.ROUND_HALF_UP).toString();
  1074. if (val.contains(".")) {
  1075. return new BigDecimal(val).toString().replaceAll("(0+|\\.0+)$", "");
  1076. }
  1077. return val;
  1078. }
  1079. return "";
  1080. }
  1081. /*
  1082. public static void main(String[] args) {
  1083. System.out.println(StringUtils.number2String("-2400.0000000000055",1));
  1084. }
  1085. */
  1086. /**
  1087. * @return java.lang.String
  1088. * @Description byte数组转Md5字符串
  1089. * @Param [bytes]
  1090. * @Author yangyj
  1091. * @Date 2021.12.20 17:10
  1092. **/
  1093. public static String bytes2Md5(byte[] bytes) {
  1094. StringBuffer sb = new StringBuffer("");
  1095. byte b[] = Md5Util.md5(bytes);
  1096. int d;
  1097. for (int i = 0; i < b.length; i++) {
  1098. d = b[i];
  1099. if (d < 0) {
  1100. d = b[i] & 0xff;
  1101. // 与上一行效果等同
  1102. // i += 256;
  1103. }
  1104. if (d < 16)
  1105. sb.append("0");
  1106. sb.append(Integer.toHexString(d));
  1107. }
  1108. return sb.toString();
  1109. }
  1110. /**
  1111. * 转换为字节数组
  1112. *
  1113. * @param str
  1114. * @return
  1115. */
  1116. public static byte[] getBytes(String str) {
  1117. if (str != null) {
  1118. try {
  1119. return str.getBytes(CHARSET_NAME);
  1120. } catch (UnsupportedEncodingException e) {
  1121. return null;
  1122. }
  1123. } else {
  1124. return null;
  1125. }
  1126. }
  1127. /**
  1128. * @param name
  1129. * @param suffix
  1130. * @param splitStr
  1131. * @return
  1132. */
  1133. public static String addSuffixInFirst(String name, String suffix, String splitStr) {
  1134. String newName = name;
  1135. if (isEmpty(name)) {
  1136. return newName;
  1137. }
  1138. int idx = name.indexOf(splitStr);
  1139. if (idx > 0) {
  1140. String templateName = name.substring(0, idx);
  1141. String templateNameNew = templateName + suffix;
  1142. newName = templateNameNew + name.substring(idx);
  1143. }
  1144. return newName;
  1145. }
  1146. public static String replaceSuffixInFirst(String name, String suffix, String splitStr) {
  1147. String newName = name;
  1148. if (isEmpty(name)) {
  1149. return newName;
  1150. }
  1151. int idx = name.indexOf(splitStr);
  1152. if (idx > 0) {
  1153. String templateName = name.substring(0, idx);
  1154. newName = newName.replace(templateName, suffix);
  1155. }
  1156. return newName;
  1157. }
  1158. /**
  1159. * @return boolean
  1160. * @Description 匹配度
  1161. * @Param [a, b]
  1162. * @Author yangyj
  1163. * @Date 2022.03.24 17:40
  1164. **/
  1165. public static boolean suitability(String a, String b) {
  1166. if (StringUtils.isNotEmpty(a, b)) {
  1167. char[] bA = b.toCharArray();
  1168. if (a.length() >= bA.length) {
  1169. for (char c : bA) {
  1170. if (!a.contains(String.valueOf(c))) {
  1171. return false;
  1172. }
  1173. }
  1174. return true;
  1175. }
  1176. }
  1177. return false;
  1178. }
  1179. /**
  1180. * @return int
  1181. * @Description 获取最大小数位
  1182. * @Param [number]
  1183. * @Author yangyj
  1184. * @Date 2021.12.23 15:08
  1185. **/
  1186. public static Integer getScale(Object... number) {
  1187. int max = 0;
  1188. if (number != null) {
  1189. for (Object n : number) {
  1190. if (StringUtils.isNotEmpty(n)) {
  1191. String[] sa = n.toString().split(",");
  1192. for (String s : sa) {
  1193. Matcher m = RegexUtils.matcher("(\\d)+.(\\d)+", s);
  1194. if (m.find()) {
  1195. int cp = new StringBuilder(m.group()).reverse().toString().indexOf(".");
  1196. if (cp < 5) {
  1197. max = Math.max(cp, max);
  1198. }
  1199. }
  1200. }
  1201. }
  1202. }
  1203. }
  1204. return max;
  1205. }
  1206. /**
  1207. * @return java.lang.String
  1208. * @Description 公式脚本转义
  1209. * @Param [f]
  1210. * @Author yangyj
  1211. * @Date 2022.10.13 21:25
  1212. **/
  1213. public static String escapeFormula(String f) {
  1214. if (isNotEmpty(f)) {
  1215. if (f.contains("&gt;") || f.contains("&lt;")) {
  1216. f = f.replace("&lt;", "<").replace("&gt;", ">");
  1217. }
  1218. if (f.contains(StringPool.QUOTE)) {
  1219. f = f.replaceAll(StringPool.QUOTE, StringPool.SINGLE_QUOTE);
  1220. }
  1221. }
  1222. return f;
  1223. }
  1224. }