package org.springside.modules.utils.text; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springside.modules.utils.base.annotation.Nullable; import org.springside.modules.utils.collection.ListUtil; import com.google.common.base.Utf8; /** * 尽量使用Common Lang StringUtils, 基本覆盖了所有类库的StringUtils * * 本类仅补充少量额外方法, 尤其是针对char的运算 * * @author calvin */ public class MoreStringUtil { /** * 高性能的Split,针对char的分隔符号,比JDK String自带的高效. * * from Commons Lange 3.5 StringUtils, 做如下优化: * * 1. 最后不做数组转换,直接返回List. * * 2. 可设定List初始大小. * * 3. preserveAllTokens 取默认值false * * @return 如果为null返回null, 如果为""返回空数组 */ public static List<String> split(@Nullable final String str, final char separatorChar, int expectParts) { if (str == null) { return null; } final int len = str.length(); if (len == 0) { return ListUtil.emptyList(); } final List<String> list = new ArrayList<String>(expectParts); int i = 0; int start = 0; boolean match = false; while (i < len) { if (str.charAt(i) == separatorChar) { if (match) { list.add(str.substring(start, i)); match = false; } start = ++i; continue; } match = true; i++; } if (match) { list.add(str.substring(start, i)); } return list; } /** * String 有replace(char,char),但缺少单独replace first/last的 */ public static String replaceFirst(@Nullable String s, char sub, char with) { if (s == null) { return null; } int index = s.indexOf(sub); if (index == -1) { return s; } char[] str = s.toCharArray(); str[index] = with; return new String(str); } /** * String 有replace(char,char)替换全部char,但缺少单独replace first/last */ public static String replaceLast(@Nullable String s, char sub, char with) { if (s == null) { return null; } int index = s.lastIndexOf(sub); if (index == -1) { return s; } char[] str = s.toCharArray(); str[index] = with; return new String(str); } /** * 判断字符串是否以字母开头 * * 如果字符串为Null或空,返回false */ public static boolean startWith(@Nullable CharSequence s, char c) { if (StringUtils.isEmpty(s)) { return false; } return s.charAt(0) == c; } /** * 判断字符串是否以字母结尾 * * 如果字符串为Null或空,返回false */ public static boolean endWith(@Nullable CharSequence s, char c) { if (StringUtils.isEmpty(s)) { return false; } return s.charAt(s.length() - 1) == c; } /** * 如果结尾字符为c, 去除掉该字符. */ public static String removeEnd(final String s, final char c) { if (endWith(s, c)) { return s.substring(0, s.length() - 1); } return s; } /** * 计算字符串被UTF8编码后的字节数 via guava * * @see Utf8#encodedLength(CharSequence) */ public static int utf8EncodedLength(@Nullable CharSequence sequence) { if (StringUtils.isEmpty(sequence)) { return 0; } return Utf8.encodedLength(sequence); } }