package com.common.trs5.util;

import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class StringUtil {

	public static boolean porcessSuffixChars = true;

	public static final String DEFAULT_DATE_FORMAT_MASK = "yyyy-MM-dd HH:mm:ss";

	public static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT_MASK);

	public static final boolean string2boolean(String string, boolean def) {
		if (isEmpty(string)) {
			return def;
		}
		return "Y".equals(string.toUpperCase()) || "TRUE".equals(string.toUpperCase())
				|| "YES".equals(string.toUpperCase()) || "1".equals(string.toUpperCase());
	}

	public static final int string2int(String str, int def) {
		int retval;
		try {
			retval = Integer.parseInt(str);
		} catch (Exception e) {
			retval = def;
		}
		return retval;
	}

	public static final long string2long(String str, long def) {
		long retval;
		try {
			retval = Long.parseLong(str);
		} catch (Exception e) {
			retval = def;
		}
		return retval;
	}

	public static final double string2double(String str, double def) {
		double retval;
		try {
			retval = Double.parseDouble(str);
		} catch (Exception e) {
			retval = def;
		}
		return retval;
	}

	public static final Date string2date(String str, Date def) {
		try {
			synchronized (simpleDateFormat) {
				return simpleDateFormat.parse(str);
			}
		} catch (Exception e) {
			return def;
		}
	}

	public static final String date2string(Date date) {
		synchronized (simpleDateFormat) {
			return simpleDateFormat.format(date);
		}
	}

	/**
	 * 判断两个字符串是否相等,区分大小写
	 * 
	 * @param str1 字符串
	 * @param str2 字符串
	 * @return 如果相等返回true,否则返回false。
	 */
	public static boolean equals(String str1, String str2) {
		if (str1 == null) {
			if (str2 == null) {
				return true;
			}
		} else
			return str1.equals(str2);
		return false;
	}

	/**
	 * 判断两个字符串是否相等,不区分大小写
	 * 
	 * @param str1 字符串
	 * @param str2 字符串
	 * @return 如果相等返回true,否则返回false。
	 */
	public static boolean equalsIgnoreCase(String str1, String str2) {
		if (str1 == null) {
			if (str2 == null) {
				return true;
			}
		} else
			return str1.equalsIgnoreCase(str2);
		return false;
	}

	/**
	 * 判断字符串是否为空。
	 * 
	 * @param str 字符串
	 * @return 如果字符串为null或者trim()后长度为0返回true,否则返回false。
	 */
	public static boolean isEmpty(String str) {
		if (str == null) {
			return true;
		} else {
			String temp = str.trim();
			if (temp.length() == 0) {
				return true;
			}
		}
		return false;
	}

	private final static String[] hexDigits = {
			"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
	};

	/**
	 * 将一个字节转化成十六进制形式的字符串
	 *
	 * @param b 字节
	 * @return 十六进制形式的字符串
	 */
	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0) {
			n = 256 + n;
		}
		int d1 = n / 16;
		int d2 = n % 16;
		return hexDigits[d1] + hexDigits[d2];
	}

	/**   
	 * 转换字节数组为十六进制字符串。
	 * 
	 * @param b 字节数组  
	 * @return 十六进制字符串  
	 */
	public final static String byteArray2HexString(byte[] b) {
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}

	/**
	 * 根据字符串的字符形式,返回字节数组形式。 
	 * 如输入字符串"AD67EA2F3BE6E5AD"返回字节数组"173,103,234,47,59,230,229,173"。
	 * 
	 * @param string 字符串
	 * @return 字节数组
	 */
	public static byte[] hexString2byteArray(String string) {
		byte[] bRet = new byte[string.length() / 2];
		for (int i = 0; i < string.length() / 2; i++) {
			Integer itg = new Integer(16 * getChar2Int(string.charAt(2 * i)) + getChar2Int(string.charAt(2 * i + 1)));
			bRet[i] = itg.byteValue();
		}
		return bRet;
	}

	// 计算一个16进制字符的10进制值。
	private static int getChar2Int(char ch) {
		for (int i = 0; i < hexDigits.length; i++) {
			if (ch == hexDigits[i].charAt(0)) {
				return i;
			}
		}
		return 0;
	}

	/**
	 * 根据选中的字符串和分隔符,以及选中的字符串重新排序。已经选中的已删除,其它按照原顺序排列。
	 * 
	 * @param string 字符串
	 * @param segment 分隔符
	 * @param checked 优先排列的字符串
	 * @return 排序后的字符列表
	 */
	public static String[] orderArray(String string, String segment, String[] checked) {
		List<String> list = orderList(string, segment, checked);
		return list.toArray(new String[0]);
	}

	/**
	 * 根据选中的字符串和分隔符,以及选中的字符串重新排序。已经选中的已删除,其它按照原顺序排列。
	 * 
	 * @param string 字符串
	 * @param segment 分隔符
	 * @param checked 优先排列的字符串
	 * @return 排序后的字符列表
	 */
	public static List<String> orderList(String string_old, String segment_old, String[] checked) {
		List<String> list = new ArrayList<String>();

		String string = string_old;
		String segment = segment_old;
		if (StringUtil.isEmpty(string)) {
			string = "";
		}

		if (StringUtil.isEmpty(segment)) {
			segment = "";
		}

		if (checked != null) {
			for (String s : checked) {
				if (!StringUtil.isEmpty(s)) {
					string = string.replace(s + segment, "");
				}
			}
		}

		String[] words = string.split(segment);
		if (words != null) {
			for (String s : words) {
				if (!list.contains(s)) {
					list.add(s);
				}
			}
		}
		return list;
	}

	/**
	 * 字符串清洗,从字符串中排除不存在于候选字符串中的值。如果候选字符串为空,返回空串。
	 * 
	 * @param string 字符串
	 * @param condidate 候选字符串
	 * @param segment 分隔符
	 * @return 清洗后的字符串
	 */
	public static String filter(String string_old, String condidate, String segment_old) {
		String segment = segment_old;
		String string = string_old;
		if (StringUtil.isEmpty(condidate)) {
			return "";
		}

		if (StringUtil.isEmpty(string)) {
			return condidate;
		}

		if (StringUtil.isEmpty(segment)) {
			segment = "";
		}

		if (!string.endsWith(segment)) {
			string += segment;
		}

		// 获取不在候选数组中的字符,再清除。
		String[] condidates = condidate.split(segment);
		List<String> list = orderList(string, segment, condidates);
		for (String s : list) {
			if (!StringUtil.isEmpty(s)) {
				string = string.replace(s + segment, "");
			}
		}

		if (string.endsWith(segment)) {
			string = string.substring(0, string.length() - segment.length());
		}

		return string;
	}

	/**
	 * 字符串清洗,从字符串中排除不存在于候选字符串中的值。如果候选字符串为空,返回空串。
	 * 
	 * @param string 字符串
	 * @param condidate 候选字符串
	 * @param segment 分隔符
	 * @return 清洗后的字符串
	 */
	public static String filterFill(String string_old, String condidate, String segment) {
		String string = string_old;
		string = filter(string, condidate, segment);

		if (StringUtil.isEmpty(string)) {
			if (StringUtil.isEmpty(condidate)) {
				return "";
			}
			return condidate;
		}

		if (!string.endsWith(segment)) {
			string += segment;
		}

		// 追加候选数组中的其它字符
		String[] condidates = condidate.split(segment);
		for (String s : condidates) {
			if (!string.contains(s + segment)) {
				string += s + segment;
			}
		}

		if (string.endsWith(segment)) {
			string = string.substring(0, string.length() - segment.length());
		}

		return string;
	}

	/**
	 * 返回对给定的字符串编码后的字符串。
	 *
	 * @param password
	 * @return 编码后的字符串
	 */
	public static final String encodePassword(String password) {
		if (!StringUtil.isEmpty(password)) {
			try {
				//创建具有指定算法名称的信息摘要   
				MessageDigest md = MessageDigest.getInstance("MD5");
				//使用指定的字节数组对摘要进行最后更新,然后完成摘要计算   
				byte[] results = md.digest(password.getBytes());
				//将得到的字节数组变成字符串返回   
				String resultString = byteArrayToHexString(results);
				byte[] resultBytes = resultString.toUpperCase().getBytes();
				String restvalue = new String(resultBytes);
				return restvalue;
			} catch (Exception ex) {}
		}
		return "";
	}

	/**   
	 * 转换字节数组为十六进制字符串  
	 * 
	 * @param b 字节数组  
	 * @return 十六进制字符串  
	 */
	public final static String byteArrayToHexString(byte[] b) {
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}

	/**
	 * 判断指定的字符串是否在数组中出现。
	 * 
	 * @param str 字符串
	 * @param array 字符串数组
	 * @return 如果指定的字符串是否在数组中出现,返回它在数组中的下标,否则返回-1
	 */
	public static int findPos(String str, String[] array) {
		if (array == null || array.length == 0)
			return -1;
		if (StringUtil.isEmpty(str))
			return -1;

		for (int i = 0; i < array.length; i++) {
			String s = array[i];
			if (StringUtil.equalsIgnoreCase(s, str))
				return i;
		}

		return -1;
	}

	public static int getLength(String str, String segment) {
		int length = 0;
		if (!StringUtil.isEmpty(str)) {
			String[] tmp = str.split(segment);
			for (String s : tmp) {
				if (!StringUtil.isEmpty(s)) {
					length++;
				}
			}
		}
		return length;
	}

	public static String formatShow(String content) {
		if (isEmpty(content)) {
			return content;
		}
		String englishOneBlanks = " ";
		String englishTwoBlanks = "  ";
		String chineseOneBlanks = " ";
		String chineseTwoBlanks = "  ";
		String chineseTwoBlank2 = "";
		String chineseTwoBlank3 = "";
		try {
			content = content.trim();

			content = replaceString(content, "\r\n", "<br>");
			content = replaceString(content, "\n", "<br>");
			content = replaceString(content, "\r", "<br>");

			content = replaceString(content, "<p>", "<br>");
			content = replaceString(content, "<P>", "<br>");
			content = replaceString(content, "<BR>", "<br>");

			content = processSpecialAscii(content);

			content = content.replaceAll(englishTwoBlanks, "");
			content = content.replaceAll(chineseTwoBlanks, "");
			content = content.replaceAll(chineseTwoBlank2, "");
			content = content.replaceAll(chineseTwoBlank3, "");
			if ((content.length() > 1) && (content.substring(0, 1).equals(chineseOneBlanks))) {
				content = content.substring(1);
			}

			content = content.replaceAll("<br>" + englishOneBlanks, "<br>");
			content = content.replaceAll("<br>" + chineseOneBlanks, "<br>");

			content = content.replaceAll("(<br>){2,}", "<br>");

			if (porcessSuffixChars) {
				content = processLastChars(content);
			}

			content = processPicDemo(content);

			content = content.replaceAll("<br>", "<br>" + chineseTwoBlanks);

			if ((content.indexOf("&nbsp;&nbsp;") != 0) && (content.indexOf(chineseTwoBlanks) != 0)) {
				content = chineseTwoBlanks + content;
			}

			content = content.trim();
		} catch (Exception e) {
			System.out.println("正文格式化显示错误!" + e);
		}
		return content;
	}

	public static String processPicDemo(String content) {
		if (isEmpty(content))
			return content;
		try {
			String[] brarr = content.split("<br>");
			boolean beforeIsPic = false;
			String[] brlink = new String[brarr.length];
			for (int i = 0; i < brarr.length; ++i) {
				brlink[i] = "<br>";
				String picdemo = brarr[i];
				if (picdemo.equals("")) {
					brlink[i] = "";
				} else if (isPicSrc(picdemo)) {
					beforeIsPic = true;
				} else if (beforeIsPic) {
					beforeIsPic = false;
					if (picdemo.length() > 40) {
						continue;
					}
					String newpicdemo = "<p align=\"center\">" + picdemo + "</p>";
					brarr[i] = newpicdemo;
					brlink[i] = "";
					brlink[(i - 1)] = "";
				}
			}

			String newcontent = "";
			for (int i = 0; i < brarr.length; ++i) {
				if (newcontent.length() == 0)
					newcontent = brarr[i];
				else {
					newcontent = newcontent + brlink[i] + brarr[i];
				}
			}
			return newcontent;
		} catch (Exception e) {
			System.out.println("处理图片下的文字描述错误!" + e);
		}
		return content;
	}

	private static boolean isPicSrc(String picdemo) {
		if (isEmpty(picdemo)) {
			return false;
		}

		if ((picdemo.indexOf("<IMAGE IDX=") >= 0) || (picdemo.indexOf("<IMG IDX=") >= 0)) {
			return true;
		}

		return (picdemo.indexOf("<img src=") >= 0);
	}

	public static String replaceString(String source, String keyword, String replacement) {
		if (source == null) {
			return "";
		}
		if ((keyword == null) || (replacement == null) || (keyword.equals(replacement))) {
			return source;
		}
		StringBuffer buffer = new StringBuffer(source.length() * 2);

		int lineBegin = 0;
		int lineEnd;
		while ((lineEnd = source.indexOf(keyword, lineBegin)) != -1) {
			buffer.append(source.substring(lineBegin, lineEnd));
			buffer.append(replacement);
			lineBegin = lineEnd + keyword.length();
		}
		buffer.append(source.substring(lineBegin, source.length()));

		return buffer.toString();
	}

	public static String processSpecialAscii(String content) {
		if (isEmpty(content)) {
			return content;
		}
		try {
			content = replaceString(content, "&#xD;", "");

			byte[] bytes = content.getBytes("UTF-8");
			for (int i = 0; i < bytes.length; ++i) {
				//	        bytes[i];

				if ((i + 1 < bytes.length) && (bytes[i] == -62) && (bytes[(i + 1)] == -96)) {
					bytes[i] = 32;
					bytes[(i + 1)] = 32;
				}

				if ((bytes[i] >= 0) && (bytes[i] <= 32)) {
					bytes[i] = 32;
				}
			}
			content = new String(bytes, "UTF-8");
			return content;
		} catch (Exception e) {
			System.out.println("处理非打印字符错误!" + e);
		}
		return content;
	}

	public static String processLastChars(String content) {
		if (isEmpty(content))
			return content;
		try {
			String[] brarr = content.split("<br>");
			for (int i = brarr.length - 1; i >= 0; --i) {
				if (brarr[i].trim().toLowerCase().equals("<trs_page_separator>")) {
					brarr[i] = "";
				} else if (brarr[i].trim().toLowerCase().equals("</trs_page_separator>")) {
					brarr[i] = "";
				} else if (isPageParam(brarr[i].trim())) {
					brarr[i] = "";
				} else {
					if (brarr[i].trim().length() > 3)
						break;
					brarr[i] = "";
				}

			}

			String newcontent = "";
			for (int i = 0; i < brarr.length; ++i) {
				if (brarr[i].equals("")) {
					continue;
				}
				if (newcontent.length() == 0)
					newcontent = brarr[i];
				else {
					newcontent = newcontent + "<br>" + brarr[i];
				}
			}
			return newcontent;
		} catch (Exception e) {
			System.out.println("处理最后字符错误!" + e);
		}
		return content;
	}
	public static boolean isPageParam(String content)
	  {
	    if (isEmpty(content)) {
	      return false;
	    }
	    String pageParams = "12345678910上下一页|<>【】[]";
	    for (int i = 0; i < content.length(); ++i) {
	      String chars = content.substring(i, i + 1);
	      if (pageParams.indexOf(chars) == -1) {
	        return false;
	      }
	    }
	    return true;
	  }
}
最近下载更多
1173727203  LV1 2020年9月12日
xuyongff  LV24 2019年11月30日
康世博  LV1 2019年10月25日
caiyingwenwang  LV18 2018年11月10日
wangfushu  LV2 2017年10月10日
qisheng77  LV2 2017年9月11日
425189774  LV2 2017年5月27日
wen332  LV6 2017年3月11日
牧野清萧  LV1 2016年5月25日
exceedutow  LV2 2015年1月16日
最近浏览更多
tangjj7260  LV18 2021年10月26日
1173727203  LV1 2020年9月12日
hfk2020  LV2 2020年5月22日
k麝神k  LV10 2020年1月6日
xuyongff  LV24 2019年11月30日
幻羽揚  LV4 2019年11月18日
康世博  LV1 2019年10月25日
liurui416  LV1 2019年8月27日
919165318  LV2 2019年7月11日
maojingxin  LV1 2019年5月15日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友