StringUtils.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. package com.poyee.util;
  2. import cn.hutool.core.text.StrFormatter;
  3. import java.util.Collection;
  4. import java.util.Map;
  5. /**
  6. * 字符串工具类
  7. *
  8. * @author zheng
  9. */
  10. public class StringUtils extends org.apache.commons.lang3.StringUtils {
  11. /**
  12. * 空字符串
  13. */
  14. public static final String NULLSTR = "";
  15. /**
  16. * 下划线
  17. */
  18. public static final char SEPARATOR = '_';
  19. private static final String UNICODE =
  20. "ÀàÈèÌìÒòÙùÁáÉéÍíÓóÚúÝýÂâÊêÎîÔôÛûŶŷÃãÕõÑñÄäËëÏïÖöÜüŸÿÅåÇçŐőŰűğ";
  21. private static final String PLAIN_ASCII =
  22. "AaEeIiOoUuAaEeIiOoUuYyAaEeIiOoUuYyAaOoNnAaEeIiOoUuYyAaCcOoUug";
  23. /**
  24. * 获取参数不为空值
  25. *
  26. * @param value defaultValue 要判断的value
  27. * @return value 返回值
  28. */
  29. public static <T> T nvl(T value, T defaultValue) {
  30. return value != null ? value : defaultValue;
  31. }
  32. /**
  33. * * 判断一个Collection是否为空, 包含List,Set,Queue
  34. *
  35. * @param coll 要判断的Collection
  36. * @return true:为空 false:非空
  37. */
  38. public static boolean isEmpty(Collection<?> coll) {
  39. return isNull(coll) || coll.isEmpty();
  40. }
  41. /**
  42. * * 判断一个Collection是否非空,包含List,Set,Queue
  43. *
  44. * @param coll 要判断的Collection
  45. * @return true:非空 false:空
  46. */
  47. public static boolean isNotEmpty(Collection<?> coll) {
  48. return !isEmpty(coll);
  49. }
  50. /**
  51. * * 判断一个对象数组是否为空
  52. *
  53. * @param objects 要判断的对象数组
  54. * * @return true:为空 false:非空
  55. */
  56. public static boolean isEmpty(Object[] objects) {
  57. return isNull(objects) || (objects.length == 0);
  58. }
  59. /**
  60. * * 判断一个对象数组是否非空
  61. *
  62. * @param objects 要判断的对象数组
  63. * @return true:非空 false:空
  64. */
  65. public static boolean isNotEmpty(Object[] objects) {
  66. return !isEmpty(objects);
  67. }
  68. /**
  69. * * 判断一个Map是否为空
  70. *
  71. * @param map 要判断的Map
  72. * @return true:为空 false:非空
  73. */
  74. public static boolean isEmpty(Map<?, ?> map) {
  75. return isNull(map) || map.isEmpty();
  76. }
  77. /**
  78. * * 判断一个Map是否为空
  79. *
  80. * @param map 要判断的Map
  81. * @return true:非空 false:空
  82. */
  83. public static boolean isNotEmpty(Map<?, ?> map) {
  84. return !isEmpty(map);
  85. }
  86. /**
  87. * * 判断一个字符串是否为空串
  88. *
  89. * @param str String
  90. * @return true:为空 false:非空
  91. */
  92. public static boolean isEmpty(String str) {
  93. return isNull(str) || NULLSTR.equals(str.trim());
  94. }
  95. /**
  96. * * 判断一个字符串是否为非空串
  97. *
  98. * @param str String
  99. * @return true:非空串 false:空串
  100. */
  101. public static boolean isNotEmpty(String str) {
  102. return !isEmpty(str);
  103. }
  104. /**
  105. * * 判断一个对象是否为空
  106. *
  107. * @param object Object
  108. * @return true:为空 false:非空
  109. */
  110. public static boolean isNull(Object object) {
  111. return object == null;
  112. }
  113. /**
  114. * * 判断一个对象是否非空
  115. *
  116. * @param object Object
  117. * @return true:非空 false:空
  118. */
  119. public static boolean isNotNull(Object object) {
  120. return !isNull(object);
  121. }
  122. /**
  123. * * 判断一个对象是否是数组类型(Java基本型别的数组)
  124. *
  125. * @param object 对象
  126. * @return true:是数组 false:不是数组
  127. */
  128. public static boolean isArray(Object object) {
  129. return isNotNull(object) && object.getClass().isArray();
  130. }
  131. /**
  132. * 去空格
  133. */
  134. public static String trim(String str) {
  135. return (str == null ? "" : str.trim());
  136. }
  137. /**
  138. * 截取字符串
  139. *
  140. * @param str 字符串
  141. * @param start 开始
  142. * @return 结果
  143. */
  144. public static String substring(final String str, int start) {
  145. if (str == null) {
  146. return NULLSTR;
  147. }
  148. if (start < 0) {
  149. start = str.length() + start;
  150. }
  151. if (start < 0) {
  152. start = 0;
  153. }
  154. if (start > str.length()) {
  155. return NULLSTR;
  156. }
  157. return str.substring(start);
  158. }
  159. /**
  160. * 截取字符串
  161. *
  162. * @param str 字符串
  163. * @param start 开始
  164. * @param end 结束
  165. * @return 结果
  166. */
  167. public static String substring(final String str, int start, int end) {
  168. if (str == null) {
  169. return NULLSTR;
  170. }
  171. if (end < 0) {
  172. end = str.length() + end;
  173. }
  174. if (start < 0) {
  175. start = str.length() + start;
  176. }
  177. if (end > str.length()) {
  178. end = str.length();
  179. }
  180. if (start > end) {
  181. return NULLSTR;
  182. }
  183. if (start < 0) {
  184. start = 0;
  185. }
  186. if (end < 0) {
  187. end = 0;
  188. }
  189. return str.substring(start, end);
  190. }
  191. /**
  192. * 格式化文本, {} 表示占位符<br>
  193. * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
  194. * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
  195. * 例:<br>
  196. * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
  197. * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
  198. * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
  199. *
  200. * @param template 文本模板,被替换的部分用 {} 表示
  201. * @param params 参数值
  202. * @return 格式化后的文本
  203. */
  204. public static String format(String template, Object... params) {
  205. if (isEmpty(params) || isEmpty(template)) {
  206. return template;
  207. }
  208. return StrFormatter.format(template, params);
  209. }
  210. /**
  211. * 下划线转驼峰命名
  212. */
  213. public static String toUnderScoreCase(String str) {
  214. if (str == null) {
  215. return null;
  216. }
  217. StringBuilder sb = new StringBuilder();
  218. // 前置字符是否大写
  219. boolean preCharIsUpperCase = true;
  220. // 当前字符是否大写
  221. boolean curreCharIsUpperCase = true;
  222. // 下一字符是否大写
  223. boolean nexteCharIsUpperCase = true;
  224. for (int i = 0; i < str.length(); i++) {
  225. char c = str.charAt(i);
  226. if (i > 0) {
  227. preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
  228. } else {
  229. preCharIsUpperCase = false;
  230. }
  231. curreCharIsUpperCase = Character.isUpperCase(c);
  232. if (i < (str.length() - 1)) {
  233. nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
  234. }
  235. if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
  236. sb.append(SEPARATOR);
  237. } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
  238. sb.append(SEPARATOR);
  239. }
  240. sb.append(Character.toLowerCase(c));
  241. }
  242. return sb.toString();
  243. }
  244. /**
  245. * 是否包含字符串
  246. *
  247. * @param str 验证字符串
  248. * @param strs 字符串组
  249. * @return 包含返回true
  250. */
  251. public static boolean inStringIgnoreCase(String str, String... strs) {
  252. if (str != null && strs != null) {
  253. for (String s : strs) {
  254. if (str.equalsIgnoreCase(trim(s))) {
  255. return true;
  256. }
  257. }
  258. }
  259. return false;
  260. }
  261. /**
  262. * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
  263. *
  264. * @param name 转换前的下划线大写方式命名的字符串
  265. * @return 转换后的驼峰式命名的字符串
  266. */
  267. public static String convertToCamelCase(String name) {
  268. StringBuilder result = new StringBuilder();
  269. // 快速检查
  270. if (name == null || name.isEmpty()) {
  271. // 没必要转换
  272. return "";
  273. } else if (!name.contains("_")) {
  274. // 不含下划线,仅将首字母大写
  275. return name.substring(0, 1).toUpperCase() + name.substring(1);
  276. }
  277. // 用下划线将原始字符串分割
  278. String[] camels = name.split("_");
  279. for (String camel : camels) {
  280. // 跳过原始字符串中开头、结尾的下换线或双重下划线
  281. if (camel.isEmpty()) {
  282. continue;
  283. }
  284. // 首字母大写
  285. result.append(camel.substring(0, 1).toUpperCase());
  286. result.append(camel.substring(1).toLowerCase());
  287. }
  288. return result.toString();
  289. }
  290. /**
  291. * 驼峰式命名法
  292. * 例如:user_name->userName
  293. */
  294. public static String toCamelCase(String s) {
  295. if (s == null) {
  296. return null;
  297. }
  298. if (s.indexOf(SEPARATOR) == -1) {
  299. return s;
  300. }
  301. s = s.toLowerCase();
  302. StringBuilder sb = new StringBuilder(s.length());
  303. boolean upperCase = false;
  304. for (int i = 0; i < s.length(); i++) {
  305. char c = s.charAt(i);
  306. if (c == SEPARATOR) {
  307. upperCase = true;
  308. } else if (upperCase) {
  309. sb.append(Character.toUpperCase(c));
  310. upperCase = false;
  311. } else {
  312. sb.append(c);
  313. }
  314. }
  315. return sb.toString();
  316. }
  317. @SuppressWarnings("unchecked")
  318. public static <T> T cast(Object obj) {
  319. return (T) obj;
  320. }
  321. /**
  322. * 西班牙语转换对应英文
  323. *
  324. * @param str
  325. * @return
  326. */
  327. public static String toAsciiString(String str) {
  328. if (isEmpty(str)) {
  329. return null;
  330. }
  331. StringBuilder sb = new StringBuilder();
  332. for (int index = 0; index < str.length(); index++) {
  333. char c = str.charAt(index);
  334. int pos = UNICODE.indexOf(c);
  335. if (pos > -1) {
  336. sb.append(PLAIN_ASCII.charAt(pos));
  337. } else {
  338. sb.append(c);
  339. }
  340. }
  341. return sb.toString();
  342. }
  343. /**
  344. * 脱敏处理 前3 后4
  345. *
  346. * @param str
  347. * @return
  348. */
  349. public static String desensitizePhone(String str) {
  350. if (StringUtils.isEmpty(str) || str.length() != 11) {
  351. return str;
  352. }
  353. return str.replaceAll("(\\w{3})\\w*(\\w{4})", "$1****$2");
  354. }
  355. /**
  356. * 对用户名脱敏
  357. *
  358. * @param username
  359. * @return
  360. */
  361. public static String desensitiseName(String username) {
  362. if (StringUtils.isEmpty(username)) {
  363. return username;
  364. }
  365. String name = StringUtils.left(Convert.toStr(username), 1);
  366. return StringUtils.rightPad(name, StringUtils.length(Convert.toStr(username)), "*");
  367. }
  368. /**
  369. * @param address
  370. * @return
  371. */
  372. public static String desensitiseAddress(String address) {
  373. if (StringUtils.isEmpty(address)) {
  374. return address;
  375. }
  376. String detailAddress = AddressResolutionUtil.addressResolution(Convert.toStr(address)).getDetailAddress();
  377. if (StringUtils.isEmpty(detailAddress)) {
  378. return "";
  379. }
  380. return Convert.toStr(address).replace(detailAddress, "********");
  381. }
  382. public static String desenstiseStr(String params, int atLength) {
  383. if (StringUtils.isEmpty(params)) {
  384. return null;
  385. }
  386. params = params.replaceAll("\\*", "0");
  387. int strLength = params.length();
  388. if (strLength <= atLength) {
  389. return params;
  390. }
  391. int i = strLength - atLength;
  392. char[] chars = new char[i];
  393. return params.replaceAll("\\w*(\\w{" + atLength + "})", new String(chars).replace(chars[0], '*') + "$1");
  394. }
  395. public static void main(String[] args) {
  396. // System.out.println(desensitiseAddress("澳门澳门半岛澳门半岛皇朝建興龍6樓j"));
  397. // System.out.println(desensitiseAddress("澳门氹仔岛氹仔岛澳門氹仔布拉干薩街濠景花園26座11樓O室"));
  398. String str = "621799*********1053";
  399. System.out.println(desenstiseStr(str, 4));
  400. }
  401. }