package cn.baiweigang.qtaf.toolkit.util; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sf.json.JSONException; import net.sf.json.JSONObject; /** * 字符串相关处理工具类 * @author @<a href='http://weibo.com/bwgang'>bwgang</a> (bwgang@163.com)<br/> */ public class StringUtil { private static LogUtil log=LogUtil.getLogger(StringUtil.class);//记录日志 /** * 过滤指定的特殊字符 * @param str * @return String */ public static String filterSpecialChar(String str) { // 清除掉所有特殊字符 String regEx="[`~!@#$%^&*()+-=|{}':;',//\\[//\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); } /** * 判断字符串是否空值或者空串, * @param str * @return boolean 非空且长度大于1时,返回false; */ public static boolean IsNullOrEmpty(String str) { if (null== str || str.length()<1) { return true; }else{ return false; } } /** * 以指定标识分割字符串, * @param s * @return List<String> 当字符串或分割标识为null或空时,返回大小为0的List */ public static List<String> getListFromString(String s,String flag) { if (IsNullOrEmpty(s)) { return new ArrayList<>(); } if (IsNullOrEmpty(flag)) { return new ArrayList<>(); } String[] ns=s.split(flag); List<String> list=new ArrayList<>(); for (int i = 0; i < ns.length; i++) { list.add(ns[i]); } return list; } /** * 查找字符串中是否存在指定字符串中的任一字符 * * @param str * @return boolean 如果存在任一个返回true,否则返回false */ public static boolean check(String str,String sIllegal) { int len = sIllegal.length(); if (null == str) return false; for (int i = 0; i < len; i++) { if (str.indexOf(sIllegal.charAt(i)) != -1) return true; } return false; } /** * 将带有htmlcode代码的字符转换成<>&'" * @param str * @return String */ public static String htmlcodeToSpecialchars(String str) { str = str.replaceAll("&", "&"); str = str.replaceAll(""", "\""); str = str.replaceAll("'", "'"); str = str.replaceAll("<", "<"); str = str.replaceAll(">", ">"); return str; } /** * 把16进制转换成字节码 * * @param hex * @return byte[] */ public static byte[] hex2byte(String hex) { byte[] bts = new byte[hex.length() / 2]; for (int i = 0; i < bts.length; i++) { bts[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16); } return bts; } /** * 判断字符串中是否包含数字 * @param src * @return boolean 有数字时返回true 否则false */ public static boolean isNumeric(String src) { Pattern numericPattern = Pattern.compile("^[0-9]+$"); if (src == null || src.equals("")) return false; boolean return_value = false; if (src != null && src.length() > 0) { Matcher m = numericPattern.matcher(src); if (m.find()) { return_value = true; } } return return_value; } /** * 判断是否位数字,并可为空 * @param src * @return boolean */ public static boolean isNumericAndCanNull(String src) { Pattern numericPattern = Pattern.compile("^[0-9]+$"); if (src == null || src.equals("")) return true; boolean return_value = false; if (src != null && src.length() > 0) { Matcher m = numericPattern.matcher(src); if (m.find()) { return_value = true; } } return return_value; } /** * 把json串中的uncode编码转换为字符串显示,转换失败返回原json串 * @param jsonStr * @return String */ public static String getStrFromJson(String jsonStr) { try { JSONObject tempJSON = JSONObject.fromObject(jsonStr); return tempJSON.toString(); } catch (Exception e) { return jsonStr; } } /** * 把map表转换为json格式字符串,转换失败返回null * @param map * @return String */ public static String getJsonStrFromMap(Map<String, String> map) { JSONObject oneResult = new JSONObject(); try { oneResult = JSONObject.fromObject(map); } catch (JSONException e) { log.error("从map表:" + map.toString() + "转换为json字符串出错"); log.error(e.getMessage()); return null; } return oneResult.toString(); } /** * 返回map中指定key的value,如果异常返回"" * @param map * @param key * @return String */ public static String getValueFromMapByKey(Map<String, ?> map, String key) { try { return map.get(key).toString(); } catch (Exception e) { return ""; } } /** * 返回map中指定key列表的map * @param map * @param list * @return Map<String, String> */ public static Map<String, String> getMapFromMapByKeyList(Map<String, String> map, List<String> list) { Map<String, String> mapTmp = new TreeMap<>(); if (null == list || list.size() < 1) { log.error("指定的key列信息为空,请检查"); return null; } for (int j = 0; j < list.size(); j++) {// 获取指定列信息 String key = list.get(j); String value = getValueFromMapByKey(map, key); mapTmp.put(key, value); } return mapTmp; } /** * 返回map表中key的列表 * @param expMap * @return List<String> */ public static List<String> getKeyListFromMap(Map<String, String> expMap) { List<String> list = new ArrayList<>(); try { for (Entry<String, String> entry : expMap.entrySet()) { list.add(entry.getKey().toString()); } } catch (Exception e) { return null; } return list; } /** * 返回字符串指定开始和结束位置之间的值 * @param str * @param start * @param end * @return String */ public static String getValueFromStr(String str, String start, String end) { try { return str.substring(str.indexOf(start), str.indexOf(end) + end.length()); } catch (Exception e) { return null; } } /** * 把字符串中的中文按指定编码urlEncode * @param value * @param encoding * @return String */ public static String transForChinese(String value, String encoding) { if (value.matches("[0-9a-zA-Z.]*")) { return value; } else { return CommUtils.urlEncode(value, encoding); } } /** * 把map表中字符串中的中文按指定编码urlEncode * @param map * @param encoding * @return Map<String, String> */ public static Map<String, String> transForChinese(Map<String, String> map,String encoding) { Map<String, String> mapTmp = map; try { for (Entry<String, String> entry : mapTmp.entrySet()) { String key = entry.getKey().toString(); String value = entry.getValue().toString(); value = transForChinese(value, encoding); mapTmp.put(key, value); } return mapTmp; } catch (Exception e) { log.error("转换map表中的中文失败"); log.error(e.getMessage()); return map; } } /** * 把字符串按&和=标识转换为map表 * @param str * @return Map<String, String> */ public static Map<String, String> getMapFromString(String str) { Map<String, String> map = new TreeMap<>(); try { String[] res = str.split("&"); for (int i = 0; i < res.length; i++) { String[] tmp = res[i].split("="); String key = tmp[0]; String value = tmp[1]; map.put(key, value); } } catch (Exception e) { log.error("字符串:" + str + "无法转换为map表"); log.error(e.getMessage()); map = null; } return map; } /** * 把map表转换为字符串,使用= 和&连接 * @param map * @return String */ public static String getStrFromMap(Map<String, String> map) { String str = ""; try { for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey().toString(); String value = entry.getValue().toString(); str += key + "=" + value + "&"; } str = str.substring(0, str.length() - 1); } catch (Exception e) { log.error("从map中转换为字符串失败"); log.error(e.getMessage()); } return str; } /** * 复制一份map表的副本 * @param map * @return Map<String, String> */ public static Map<String, String> cloneMap(Map<String, String> map) { Map<String, String> clonemap = new TreeMap<>(); if (null == map) { return null; } for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey().toString(); String value = entry.getValue().toString(); clonemap.put(key, value); } return clonemap; } /** * 把map转换为xml格式内容,其中中文不进行urlEncode转码 * @param map * @return String */ public static String getXmlFromMap(Map<String, String> map) { String xmlbody = ""; if (null == map || map.size() < 1) { return ""; } for (Entry<String, String> entry : map.entrySet()) { xmlbody += "<" + entry.getKey() + ">" + entry.getValue() + "</" + entry.getKey() + ">"; } return xmlbody; } /** * 把map转换为xml格式内容,其中中文按指定编码 urlEncode转码 * @param map * @param encoding * @return String */ public static String getXmlFromMap(Map<String, String> map, String encoding) { String xmlbody = ""; if (null == map || map.size() < 1) { return ""; } for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey().toString(); String value = entry.getValue().toString(); if (!value.matches("[0-9a-zA-Z.]*")) { // 中文按照enCoding字段指定编码进行urlEncode转码 value = CommUtils.urlEncode(value, encoding); } xmlbody += "<" + key + ">" + value + "</" + key + ">"; } return xmlbody; } /** * 重新编码 * @param str * @param newCharset * @return String */ public static String changeCharset(String str, String newCharset) { if (!IsNullOrEmpty(str)) { // 用默认字符编码解码字符串。 byte[] bs = str.getBytes(); // 用新的字符编码生成字符串 try { return new String(bs, newCharset); } catch (UnsupportedEncodingException e) { log.error(e.getMessage()); return null; } } return null; } /** * 重新编码 * @param str * @param oldCharset * @param newCharset * @return String */ public static String changeCharset(String str, String oldCharset,String newCharset) { if (!IsNullOrEmpty(str)) { try { // 用默认字符编码解码字符串。 byte[] bs = str.getBytes(oldCharset); // 用新的字符编码生成字符串 return new String(bs, newCharset); } catch (UnsupportedEncodingException e) { return null; } } return null; } /** * 判断字符串是否包含中文 如果包含则返回true * @param strName * @return boolean */ public static boolean isChinese(String strName) { char[] ch = strName.toCharArray(); for (int i = 0; i < ch.length; i++) { char c = ch[i]; if (isChinese(c)) { return true; } } return false; } // 根据Unicode编码完美的判断中文汉字和符号 private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) { return true; } return false; } }