wg-basic/basic-util/src/main/java/ink/wgink/util/string/WStringUtil.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);
}
}