424 lines
12 KiB
Java
424 lines
12 KiB
Java
package ink.wgink.util.string;
|
|
|
|
|
|
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.lang3.StringUtils;
|
|
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
/**
|
|
* 字符串相关方法
|
|
*/
|
|
public class WStringUtil {
|
|
|
|
static final Pattern LOWER_UPPER_PATTERN = Pattern.compile("[A-Z][a-z]*");
|
|
|
|
/**
|
|
* 将以逗号分隔的字符串转换成字符串数组
|
|
*
|
|
* @param valStr
|
|
* @return String[]
|
|
*/
|
|
public static String[] strList(String valStr) {
|
|
int i = 0;
|
|
String TempStr = valStr;
|
|
String[] returnStr = new String[valStr.length() + 1 - TempStr.replace(",", "").length()];
|
|
valStr = valStr + ",";
|
|
while (valStr.indexOf(',') > 0) {
|
|
returnStr[i] = valStr.substring(0, valStr.indexOf(','));
|
|
valStr = valStr.substring(valStr.indexOf(',') + 1, valStr.length());
|
|
i++;
|
|
}
|
|
return returnStr;
|
|
}
|
|
|
|
/**
|
|
* 获取字符串编码
|
|
*
|
|
* @param str
|
|
* @return
|
|
*/
|
|
public static String getEncoding(String str) {
|
|
String encode = "GB2312";
|
|
try {
|
|
if (str.equals(new String(str.getBytes(encode), encode))) {
|
|
String s = encode;
|
|
return s;
|
|
}
|
|
} catch (Exception exception) {
|
|
}
|
|
encode = "ISO-8859-1";
|
|
try {
|
|
if (str.equals(new String(str.getBytes(encode), encode))) {
|
|
String s1 = encode;
|
|
return s1;
|
|
}
|
|
} catch (Exception exception1) {
|
|
}
|
|
encode = "UTF-8";
|
|
try {
|
|
if (str.equals(new String(str.getBytes(encode), encode))) {
|
|
String s2 = encode;
|
|
return s2;
|
|
}
|
|
} catch (Exception exception2) {
|
|
}
|
|
encode = "GBK";
|
|
try {
|
|
if (str.equals(new String(str.getBytes(encode), encode))) {
|
|
String s3 = encode;
|
|
return s3;
|
|
}
|
|
} catch (Exception exception3) {
|
|
}
|
|
return "";
|
|
}
|
|
|
|
/**
|
|
* 第一个字母转小写,英文
|
|
*
|
|
* @param str
|
|
* @return
|
|
*/
|
|
public static String firstToLower(String str) {
|
|
return str.substring(0, 1).toLowerCase() + str.substring(1);
|
|
}
|
|
|
|
/**
|
|
* 第一个字母大写、英文
|
|
*
|
|
* @param str
|
|
* @return
|
|
*/
|
|
public static String firstToUpper(String str) {
|
|
return str.substring(0, 1).toUpperCase() + str.substring(1);
|
|
}
|
|
|
|
/**
|
|
* <p>
|
|
* title 驼峰名称转下划线名称
|
|
* </p>
|
|
* <p>
|
|
* description 驼峰名称转小写名称用下划线名称
|
|
* </p>
|
|
*
|
|
* @param str
|
|
* @return
|
|
* @author WenG
|
|
* @date 2018年2月28日 下午4:28:45
|
|
* @modifier WenG
|
|
* @date 2018年2月28日 下午4:28:45
|
|
*/
|
|
public static String lowerUpper2UnderLine(String str) {
|
|
return lowerUpper2Separator(str, "-");
|
|
}
|
|
|
|
/**
|
|
* <p>
|
|
* title 驼峰名称转分隔符名称
|
|
* </p>
|
|
* <p>
|
|
* description 驼峰名称转小写名称用分隔符名称
|
|
* </p>
|
|
*
|
|
* @param str
|
|
* @param separator
|
|
* @return
|
|
*/
|
|
public static String lowerUpper2Separator(String str, String separator) {
|
|
Matcher matcher = LOWER_UPPER_PATTERN.matcher(str);
|
|
while (matcher.find()) {
|
|
String group = matcher.group();
|
|
String lower = separator + group.toLowerCase();
|
|
str = str.replaceFirst(group, lower);
|
|
matcher = LOWER_UPPER_PATTERN.matcher(str);
|
|
}
|
|
if (str.startsWith(separator)) {
|
|
str = str.substring(1);
|
|
}
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* <p>
|
|
* title 下划线分割转驼峰式
|
|
* </p>
|
|
* <p>
|
|
* description 下划线分割转驼峰式
|
|
* </p>
|
|
*
|
|
* @param str
|
|
* @return
|
|
* @author WenG
|
|
* @date 2018年2月28日 下午4:49:13
|
|
* @modifier WenG
|
|
* @date 2018年2月28日 下午4:49:13
|
|
*/
|
|
public static String underLine2LowerUpper(String str) {
|
|
return separator2LowerUpper(str, "_");
|
|
}
|
|
|
|
/**
|
|
* <p>
|
|
* title 分割符转驼峰式
|
|
* </p>
|
|
* <p>
|
|
* description 分割符转驼峰式
|
|
* </p>
|
|
*
|
|
* @param str 字符串
|
|
* @param separator 分隔符
|
|
* @return
|
|
*/
|
|
public static String separator2LowerUpper(String str, String separator) {
|
|
String[] strs = str.split(separator);
|
|
StringBuilder sb = new StringBuilder();
|
|
for (int i = 0; i < strs.length; i++) {
|
|
String letter = strs[i].toLowerCase();
|
|
if (letter.length() == 0) {
|
|
continue;
|
|
}
|
|
if (i == 0) {
|
|
sb.append(letter);
|
|
} else {
|
|
int firstLetter = letter.charAt(0);
|
|
firstLetter -= 32;
|
|
sb.append((char) firstLetter).append(letter.substring(1));
|
|
}
|
|
}
|
|
if (sb.length() > 0) {
|
|
return sb.toString();
|
|
}
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* <p>
|
|
* title 下划线分割转驼峰式
|
|
* </p>
|
|
* <p>
|
|
* description 下划线分割转驼峰式
|
|
* </p>
|
|
*
|
|
* @param str
|
|
* @param firstLower 第一个字母小写
|
|
* @return
|
|
* @author WenG
|
|
* @date 2018年2月28日 下午4:56:28
|
|
* @modifier WenG
|
|
* @date 2018年2月28日 下午4:56:28
|
|
*/
|
|
public static String underLine2LowerUpper(String str, boolean firstLower) {
|
|
String result = underLine2LowerUpper(str);
|
|
if (firstLower) {
|
|
int first = result.charAt(0) + 32;
|
|
result = ((char) first) + result.substring(1);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* <p>
|
|
* title 分隔符转驼峰式
|
|
* </p>
|
|
* <p>
|
|
* description 分隔符转驼峰式
|
|
* </p>
|
|
*
|
|
* @param str 字符串
|
|
* @param separator 分隔符
|
|
* @param firstLower 首字母小写
|
|
* @return
|
|
*/
|
|
public static String separator2LowerUpper(String str, String separator, boolean firstLower) {
|
|
String result = separator2LowerUpper(str, separator);
|
|
if (firstLower) {
|
|
int first = result.charAt(0) + 32;
|
|
result = ((char) first) + result.substring(1);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 获取拼音
|
|
*
|
|
* @param src
|
|
* @return
|
|
*/
|
|
public static String getPingYin(String src) {
|
|
char[] t1 = null;
|
|
t1 = src.toCharArray();
|
|
String[] t2 = new String[t1.length];
|
|
HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
|
|
t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
|
|
t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
|
|
t3.setVCharType(HanyuPinyinVCharType.WITH_V);
|
|
String t4 = "";
|
|
int t0 = t1.length;
|
|
try {
|
|
for (int i = 0; i < t0; i++) {
|
|
// 判断是否为汉字字符
|
|
if (Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")) {
|
|
t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);
|
|
t4 += t2[0];
|
|
} else {
|
|
t4 += Character.toString(t1[i]);
|
|
}
|
|
}
|
|
return t4;
|
|
} catch (BadHanyuPinyinOutputFormatCombination e1) {
|
|
e1.printStackTrace();
|
|
}
|
|
return t4;
|
|
}
|
|
|
|
/**
|
|
* 获取中文首字母
|
|
*
|
|
* @param str
|
|
* @return
|
|
*/
|
|
public static String getPinYinHeadChar(String str) {
|
|
String convert = "";
|
|
for (int j = 0; j < str.length(); j++) {
|
|
char word = str.charAt(j);
|
|
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
|
|
if (pinyinArray != null) {
|
|
convert += pinyinArray[0].charAt(0);
|
|
} else {
|
|
convert += word;
|
|
}
|
|
}
|
|
return convert;
|
|
}
|
|
|
|
/**
|
|
* 汉字转ASCII码
|
|
*
|
|
* @param cnStr
|
|
* @return
|
|
*/
|
|
public static String getCnASCII(String cnStr) {
|
|
StringBuffer strBuf = new StringBuffer();
|
|
byte[] bGBK = cnStr.getBytes();
|
|
for (int i = 0; i < bGBK.length; i++) {
|
|
// System.out.println(Integer.toHexString(bGBK[i]&0xff));
|
|
strBuf.append(Integer.toHexString(bGBK[i] & 0xff));
|
|
}
|
|
return strBuf.toString();
|
|
}
|
|
|
|
/**
|
|
* 从字符串中随机取出新的字符串
|
|
*
|
|
* @param input 输入字符串
|
|
* @param outLength 新字符串长度
|
|
* @return
|
|
*/
|
|
public static String randomSubStr(String input, int outLength) {
|
|
if (input == null || input.isEmpty()) {
|
|
return null;
|
|
}
|
|
if (outLength >= input.length()) {
|
|
outLength = input.length();
|
|
}
|
|
if (outLength <= 0) {
|
|
outLength = 6;
|
|
}
|
|
StringBuilder subStrSB = new StringBuilder();
|
|
Random random = new Random();
|
|
for (int i = 0; i < outLength; i++) {
|
|
subStrSB.append(input.charAt(random.nextInt(input.length())));
|
|
}
|
|
return subStrSB.toString();
|
|
}
|
|
|
|
/**
|
|
* string对象转数组
|
|
*
|
|
* @param strObj stirng 对象
|
|
* @param separator 分隔符
|
|
* @return 字符串数组
|
|
*/
|
|
public static String[] strObjToArray(Object strObj, String separator) {
|
|
if (strObj == null || separator == null) {
|
|
throw new RuntimeException("参数不能为空!");
|
|
}
|
|
if (!(strObj instanceof String)) {
|
|
throw new RuntimeException("第一个参数只能是String类型");
|
|
}
|
|
return strObj.toString().split(separator);
|
|
}
|
|
|
|
/**
|
|
* 字符串列表转字符串
|
|
*
|
|
* @param strings 字符串列表
|
|
* @param separator 分隔符
|
|
* @return
|
|
*/
|
|
public static String listToStr(List<String> strings, String separator) {
|
|
if (strings == null || strings.isEmpty()) {
|
|
return null;
|
|
}
|
|
StringBuilder sb = new StringBuilder();
|
|
for (String str : strings) {
|
|
if (sb.length() > 0) {
|
|
sb.append(separator);
|
|
}
|
|
sb.append(str);
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
/**
|
|
* 倒序截断重复字符
|
|
*
|
|
* @return
|
|
*/
|
|
public static String cutContinuityRepeatCharDesc(String str, char repeatChar) {
|
|
if (StringUtils.isBlank(str)) {
|
|
return str;
|
|
}
|
|
int unRepeatCharIndex = 0;
|
|
for (int i = str.length() - 1; i >= 0; i--) {
|
|
if (str.charAt(i) != repeatChar) {
|
|
unRepeatCharIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
return str.substring(0, unRepeatCharIndex + 1);
|
|
}
|
|
|
|
/**
|
|
* 倒叙截取重复字段
|
|
*
|
|
* @param str
|
|
* @param repeatChar
|
|
* @param minRepeatCount
|
|
* @return
|
|
*/
|
|
public static String cutContinuityRepeatCharDesc(String str, char repeatChar, int minRepeatCount) {
|
|
int repeatCount = 0;
|
|
for (int i = str.length() - 1; i >= 0; i--) {
|
|
if (str.charAt(i) != repeatChar) {
|
|
break;
|
|
}
|
|
repeatCount++;
|
|
}
|
|
if (repeatCount < minRepeatCount) {
|
|
return str;
|
|
}
|
|
return cutContinuityRepeatCharDesc(str, repeatChar);
|
|
}
|
|
|
|
}
|