package com.matrix.core.tools; import com.matrix.core.exception.GlobleException; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; import org.apache.commons.collections.CollectionUtils; import org.springframework.util.AntPathMatcher; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 字符串操作类,转换数据类型,切割字符串,对象比较等操作 * * @author JIANGYOUYAO * @email 935090232@qq.com * @date 2017年11月29日 */ public class StringUtils { private static final String REPLACE_CHAR = "*"; private static final int SAVA_CHAR_LENGTH = 4; private static final String EMPTY = ""; /** * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 * * @param str 指定字符串 * @param strs 需要检查的字符串数组 * @return 是否匹配 */ public static boolean matches(String str, List strs) { if (isBlank(str) || CollectionUtils.isEmpty(strs)) { return false; } for (String pattern : strs) { if (isMatch(pattern, str)) { return true; } } return false; } /** * 判断url是否与规则配置: * ? 表示单个字符; * * 表示一层路径内的任意字符串,不可跨层级; * ** 表示任意层路径; * * @param pattern 匹配规则 * @param url 需要匹配的url * @return */ public static boolean isMatch(String pattern, String url) { AntPathMatcher matcher = new AntPathMatcher(); return matcher.match(pattern, url); } /** * 将字符串中的某些值用指定字符代替 * * @param str 原始字符串 * @param saveLength 保留位数 * @param replaceChar 替换成的字符 * @return */ public static String replaceStr(String str, int saveLength, String replaceChar) { if (saveLength <= 0) { saveLength = SAVA_CHAR_LENGTH; } if (replaceChar == null) { replaceChar = REPLACE_CHAR; } if (isBlank(str) || str.length() < saveLength) { return ""; } char[] chars = str.toCharArray(); StringBuffer stb = new StringBuffer(); for (int i = 0; i < chars.length; i++) { if (i < (saveLength - 1) / 2 || (chars.length - i - 1) < (saveLength + 2) / 2) { stb.append(chars[i]); } else { stb.append(replaceChar); } } return stb.toString(); } /** * 是否为空,去除首尾空格后比较 * * @param str * @return */ public static boolean isBlank(String str) { if (str == null) { return true; } if (EMPTY.equals(str.trim())) { return true; } return false; } /** * 不为空,去除首尾空格 * * @param str * @return */ public static boolean isNotBlank(String str) { if (str == null) { return false; } if (EMPTY.equals(str.trim())) { return false; } return true; } /** * 去除字符串首尾空格 * * @param str * @return */ public static String trim(String str) { if (isNotBlank(str)) { return str.trim(); } return str; } /** * 两个字符串是否相等 * * @param a * @param b * @return */ public static boolean equals(String a, String b) { if (a == null && b == null) { return true; } else if (a != null && b != null) { if (a.trim().equals(b.trim())) { return true; } } return false; } /** * 两个字符串是否相等 * * @param a * @param b * @return */ public static boolean notEquals(String a, String b) { return !equals(a, b); } /** * 忽略大小写后两个字符串是否相等 * * @param a * @param b * @return */ public static boolean equalsIgnoreCase(String a, String b) { if (a == null && b == null) { return true; } else if (a != null && b != null) { return a.toUpperCase().equals(b.toUpperCase()); } else { return false; } } /** * 忽略大小写后两个字符串是否相等 * * @param a * @param b * @return */ public static boolean notEqualsIgnoreCase(String a, String b) { return !equalsIgnoreCase(a, b); } /** * 用字符串split风格字符串str成数组 * * @param str * @param split * @return */ public static String[] stringToArray(String str, String split) { if (isBlank(str)) { return null; } else { return str.split(split); } } /** * 如果值为null或者是空格则显示空 * * @param str * @return */ public static String getString(String str) { if (isBlank(str)) { return EMPTY; } return str.trim(); } /** * 字符串如果为空或空格则返回null * * @param str * @return */ public static String getNull(String str) { if (isNotBlank(str)) { return str; } return null; } /** * 填充字符串到指定长度 * * @param source 原始字符串 * @param length 填充到长度 * @param chars 填充字符 * @param fillLeft true-左填充,false-右填充 * @return */ public static String fillStringWithChar(String source, int length, char chars, boolean fillLeft) { if (StringUtils.isNotBlank(source) && length > 0) { int realLength = length - source.length(); StringBuffer stb = new StringBuffer(); for (; realLength > 0; realLength--) { stb.append(chars); } if (fillLeft) { return stb.toString() + source; } else { return source + stb.toString(); } } return source; } /** * 去掉json字符串两头的中括号 * * @param jsonArrStr * @return */ public static String getJsonObjStr(String jsonArrStr) { String tempString = jsonArrStr.trim(); if (tempString.startsWith("[") && tempString.endsWith("]")) { return tempString.substring(1, tempString.length() - 1); } else { return tempString; } } private static final int MAX_GENERATE_COUNT = 99999; private static int generateCount = 0; public static synchronized String getUniqueString() { if (generateCount > MAX_GENERATE_COUNT) { generateCount = 0; } String uniqueNumber = Long.toString(System.currentTimeMillis()) + Integer.toString(generateCount); generateCount++; return uniqueNumber; } /*** * 针对javascript encodeURIComponent编码后进行解码 * * @param str * @return * @throws UnsupportedEncodingException */ public static String decode(String str) throws UnsupportedEncodingException { return java.net.URLDecoder.decode(str, "UTF-8"); } public static String encodingUTF(String str) throws UnsupportedEncodingException { if (str == null) { return null; } return new String(str.getBytes("ISO8859-1"), "UTF-8"); } /** * 获得不重复的32位的随机的大写字符串 * * @Return:String * @Author: JiangYouYao * @Version: V1.00 (版本号1.0) * @Create Date: 2014-8-30(创建日期) */ public static String uuid() { return UUID.randomUUID().toString().replace("-", "").toUpperCase(); } /** * 把一个集合转化成一个字符串,null或size为0时转化为空串 */ public static String collToStr(Collection collection, String splitPatten) { if (CollectionUtils.isEmpty(collection)) { return ""; } Iterator it = collection.iterator(); StringBuilder sb = new StringBuilder(); while (it.hasNext()) { sb.append(it.next().toString() + splitPatten); } int lastIndex = sb.lastIndexOf(splitPatten); return sb.substring(0, lastIndex); } /** * 字符串转集合 * * @param sour 原字符串 * @param splitPatten 截取规则 * @return List */ public static List strToColl(String sour, String splitPatten) { List list = new ArrayList<>(); if (sour != null) { String[] temps = sour.split(splitPatten); for (String string : temps) { list.add(string); } } return list; } /** * 字符串转集合 * * @param sour 原字符串 * @param splitPatten 截取规则 * @return List */ public static List strToCollToString(String sour, String splitPatten) { List list = new ArrayList<>(); if (sour != null) { String[] temps = sour.split(splitPatten); for (String string : temps) { list.add(string); } } return list; } /** * 字符串转集合 * * @param sour 原字符串 * @param splitPatten 截取规则 * @return List */ public static List strToCollToInteger(String sour, String splitPatten) { List list = new ArrayList<>(); if (sour != null) { String[] temps = sour.split(splitPatten); for (String string : temps) { list.add(Integer.valueOf(string)); } } return list; } /** * @Title: getRandomString * 获取一个获得一定长度的随机数,包含大写字母及数字 @author:jyy @param length @return @return * String 返回类型 @date 2016年7月19日 下午3:01:20 @throws */ public static String getRandomString(int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { int number = random.nextInt(str.length()); sb.append(str.charAt(number)); } return sb.toString(); } /** * 用逗号分开的存的id是否包含对应的id 如比较 123,123,124 中是否包含12这个主键 比对的方法是 字符串中是否包含"^12$" * "^12,.*" 或者 ".+,12$" 或者 ".+,12,$" 或者 ".+,12,.+" 字符串 */ public static boolean isContentSet(String id, String setStr) { id = id.trim(); setStr = setStr.trim(); String reg = "^" + id + "$|^" + id + ",.*|.+," + id + "$|.+," + id + ",$|.+," + id + ",.+"; Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern.matcher(setStr); boolean result = matcher.matches(); LogUtil.info("id=[" + id + "] : setStr =[" + setStr + "] :result=" + result); return result; } public static List strToCollToLong(String sour, String splitPatten) { List list = new ArrayList<>(); if (isNotBlank(sour)) { String[] temps = sour.split(splitPatten); for (String string : temps) { list.add(Long.parseLong(string)); } } return list; } /** * 检测temp包含多个参数 * * @param temp * @param cons * @return */ public static boolean checkContainMore(String temp, String... cons) { if (temp == null) { return false; } for (String con : cons) { if (temp.contains(con)) { return true; } } return false; } /** * 将字符串转换为整形 * * @param str * @return */ public static int stringToInt(String str) { if (StringUtils.isBlank(str)) { return 0; } try { return Integer.valueOf(str).intValue(); } catch (Exception e) { return 0; } } /** * 将文字转为汉语拼音 * * @param chineselanguage 要转成拼音的中文 */ public static String toHanyuPinyin(String chineseStr) { char[] cl_chars = chineseStr.trim().toCharArray(); String hanyupinyin = ""; HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调 defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V); try { for (int i = 0; i < cl_chars.length; i++) { if (String.valueOf(cl_chars[i]).matches("[\u4e00-\u9fa5]+")) {// 如果字符是中文,则将中文转为汉语拼音 String py = PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0]; hanyupinyin += py; } else {// 如果字符不是中文,则不转换 if (StringUtils.isNotBlank(cl_chars[i] + "") && !isSpecialChar(cl_chars[i] + "")) { hanyupinyin += cl_chars[i]; } } } } catch (BadHanyuPinyinOutputFormatCombination e) { throw new GlobleException("助记码生成错误" + e.getMessage()); } return hanyupinyin; } /** * 将首字母转汉语拼音 * * @param chineselanguage 要转成拼音的中文 */ public static String toHeadWordHanyuPinyin(String chineseStr) { char[] cl_chars = chineseStr.trim().toCharArray(); String hanyupinyin = ""; HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调 defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V); try { for (int i = 0; i < cl_chars.length; i++) { if (String.valueOf(cl_chars[i]).matches("[\u4e00-\u9fa5]+")) {// 如果字符是中文,则将中文转为汉语拼音 String py = PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0]; hanyupinyin += py.substring(0,1); } else {// 如果字符不是中文,则不转换 if (StringUtils.isNotBlank(cl_chars[i] + "") && !isSpecialChar(cl_chars[i] + "")) { hanyupinyin += cl_chars[i]; } } } } catch (BadHanyuPinyinOutputFormatCombination e) { throw new GlobleException("助记码生成错误" + e.getMessage()); } return hanyupinyin; } /** * 判断是否含有特殊字符 * * @param str * @return true为包含,false为不包含 */ public static boolean isSpecialChar(String str) { String regEx = "[ -_`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\n|\r|\t"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.find(); } public static boolean isStartWithNumber(String str) { Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str.charAt(0) + ""); if (!isNum.matches()) { return false; } return true; } }