/** * * Copyright 2008 - 2012 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loon * @author cping * @email:javachenpeng@yahoo.com * @version 0.3.3 */ package org.ripple.power.utils; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.ripple.power.i18n.LangConfig; import com.google.common.base.Strings; final public class StringUtils { public final static Pattern VALID_EMAIL_ADDRESS_REGEX = Pattern.compile( "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE); public final static Pattern VALID_PHONE_REGEX = Pattern .compile("^\\(\\d{3}\\)\\d{3}\\-\\d{4}$"); private static final String whiteRange = "\\p{javaWhitespace}\\p{Zs}"; private static final Pattern whiteStart = Pattern.compile("^[" + whiteRange + "]+"); private static final Pattern whiteEnd = Pattern.compile("[" + whiteRange + "]+$"); public static final String ASCII_CHARSET = "US-ASCII"; public static final String ISO88591_CHARSET = "ISO-8859-1"; private StringUtils() { } public static String join(String flag, Object... o) { StringBuilder sbr = new StringBuilder(); for (int i = 0; i < o.length; i++) { sbr.append(o[i]); sbr.append(flag); } return sbr.toString(); } public static String toLineBreaks(String[] lines) { final StringBuilder sbr; if (LangConfig.isLeftToRight()) { sbr = new StringBuilder( "<html><body style='width: 100%'><div align=left>"); } else { sbr = new StringBuilder( "<html><body style='width: 100%'><div align=right>"); } boolean first = true; for (String line : lines) { if (!first) { sbr.append("<br>"); } sbr.append("<p>").append(line).append("</p>"); first = false; } sbr.append("</div></body></html>"); return sbr.toString(); } public static String toWithCenteredLinedBreaks(String[] lines) { final StringBuilder sbr = new StringBuilder( "<html><body style='width: 100%'><div align=center>"); boolean first = true; for (String line : lines) { if (!first) { sbr.append("<br>"); } sbr.append("<p>").append(line).append("</p>"); first = false; } sbr.append("</div></body></html>"); return sbr.toString(); } public static String toBoldFragments(String fragment, String sourceText) { if (Strings.isNullOrEmpty(fragment) || Strings.isNullOrEmpty(sourceText)) { return "<html>" + sourceText + "</html>"; } String lowerFragment = fragment.toLowerCase(); String lowerSource = sourceText.toLowerCase(); int sourceIndex = 0; int matchIndex; StringBuilder sbr = new StringBuilder("<html>"); do { matchIndex = lowerSource.indexOf(lowerFragment, sourceIndex); if (matchIndex > -1) { sbr.append(sourceText.substring(sourceIndex, matchIndex)) .append("<b>") .append(sourceText.substring(matchIndex, matchIndex + fragment.length())).append("</b>"); sourceIndex = matchIndex + fragment.length(); } } while (matchIndex > -1); sbr.append(sourceText.substring(sourceIndex)); sbr.append("</html>"); return sbr.toString(); } public static String ltrim(String text) { if (text == null) { return ""; } Matcher mStart = whiteStart.matcher(text); return mStart.find() ? text.substring(mStart.end()) : text; } public static String rtrim(String text) { if (text == null) { return ""; } Matcher mEnd = whiteEnd.matcher(text); if (mEnd.find()) { int matchStart = mEnd.start(); return text.substring(0, matchStart); } else { return text; } } public static String trim(String text) { return (rtrim(ltrim(text.trim()))).trim(); } public final static boolean startsWith(String n, char tag) { return n.charAt(0) == tag; } public final static boolean endsWith(String n, char tag) { return n.charAt(n.length() - 1) == tag; } public static boolean isNumber(String str) { if (StringUtils.isEmpty(str)) { return false; } char[] chars = str.toCharArray(); int sz = chars.length; boolean hasExp = false; boolean hasDecPoint = false; boolean allowSigns = false; boolean foundDigit = false; int start = (chars[0] == '-') ? 1 : 0; if (sz > start + 1) { if (chars[start] == '0' && chars[start + 1] == 'x') { int i = start + 2; if (i == sz) { return false; } for (; i < chars.length; i++) { if ((chars[i] < '0' || chars[i] > '9') && (chars[i] < 'a' || chars[i] > 'f') && (chars[i] < 'A' || chars[i] > 'F')) { return false; } } return true; } } sz--; int i = start; while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) { if (chars[i] >= '0' && chars[i] <= '9') { foundDigit = true; allowSigns = false; } else if (chars[i] == '.') { if (hasDecPoint || hasExp) { return false; } hasDecPoint = true; } else if (chars[i] == 'e' || chars[i] == 'E') { if (hasExp) { return false; } if (!foundDigit) { return false; } hasExp = true; allowSigns = true; } else if (chars[i] == '+' || chars[i] == '-') { if (!allowSigns) { return false; } allowSigns = false; foundDigit = false; } else { return false; } i++; } if (i < chars.length) { if (chars[i] >= '0' && chars[i] <= '9') { return true; } if (chars[i] == 'e' || chars[i] == 'E') { return false; } if (!allowSigns && (chars[i] == 'd' || chars[i] == 'D' || chars[i] == 'f' || chars[i] == 'F')) { return foundDigit; } if (chars[i] == 'l' || chars[i] == 'L') { return foundDigit && !hasExp; } return false; } return !allowSigns && foundDigit; } /** * 拼接指定对象数组为String * * @param res * @return */ public static String concat(Object... res) { StringBuffer sbr = new StringBuffer(res.length); for (int i = 0; i < res.length; i++) { if (res[i] instanceof Integer) { sbr.append((Integer) res[i]); } else { sbr.append(res[i]); } } return sbr.toString(); } /** * 判定是否由纯粹的西方字符组成 * * @param string * @return */ public static boolean isEnglishAndNumeric(String string) { if (string == null || string.length() == 0) { return false; } char[] chars = string.toCharArray(); int size = chars.length; for (int j = 0; j < size; j++) { char letter = chars[j]; if ((97 > letter || letter > 122) && (65 > letter || letter > 90) && (48 > letter || letter > 57)) { return false; } } return true; } /** * 判定是否为半角符号 * * @param c * @return */ public static boolean isSingle(final char c) { return (':' == c || ':' == c) || (',' == c || ',' == c) || ('"' == c || '“' == c) || ((0x0020 <= c) && (c <= 0x007E) && !((('a' <= c) && (c <= 'z')) || (('A' <= c) && (c <= 'Z'))) && !('0' <= c) && (c <= '9')); } /** * 分解字符串 * * @param string * @param tag * @return */ public static String[] split(final String string, final String tag) { StringTokenizer str = new StringTokenizer(string, tag); String[] result = new String[str.countTokens()]; int index = 0; for (; str.hasMoreTokens();) { result[index++] = str.nextToken(); } return result; } /** * 过滤指定字符串 * * @param string * @param oldString * @param newString * @return */ public static final String replace(String string, String oldString, String newString) { if (string == null) return null; if (newString == null) return string; int i = 0; if ((i = string.indexOf(oldString, i)) >= 0) { char string2[] = string.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(string2.length); buf.append(string2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = string.indexOf(oldString, i)) > 0; j = i) { buf.append(string2, j, i - j).append(newString2); i += oLength; } buf.append(string2, j, string2.length - j); return buf.toString(); } else { return string; } } /** * 不匹配大小写的过滤指定字符串 * * @param line * @param oldString * @param newString * @return */ public static final String replaceIgnoreCase(String line, String oldString, String newString) { if (line == null) return null; String lcLine = line.toLowerCase(); String lcOldString = oldString.toLowerCase(); int i = 0; if ((i = lcLine.indexOf(lcOldString, i)) >= 0) { char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = lcLine.indexOf(lcOldString, i)) > 0; j = i) { buf.append(line2, j, i - j).append(newString2); i += oLength; } buf.append(line2, j, line2.length - j); return buf.toString(); } else { return line; } } /** * 不匹配大小写的过滤指定字符串 * * @param line * @param oldString * @param newString * @param count * @return */ public static final String replaceIgnoreCase(String line, String oldString, String newString, int count[]) { if (line == null) return null; String lcLine = line.toLowerCase(); String lcOldString = oldString.toLowerCase(); int i = 0; if ((i = lcLine.indexOf(lcOldString, i)) >= 0) { int counter = 1; char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = lcLine.indexOf(lcOldString, i)) > 0; j = i) { counter++; buf.append(line2, j, i - j).append(newString2); i += oLength; } buf.append(line2, j, line2.length - j); count[0] = counter; return buf.toString(); } else { return line; } } /** * 以指定条件过滤字符串 * * @param line * @param oldString * @param newString * @param count * @return */ public static final String replace(String line, String oldString, String newString, int count[]) { if (line == null) return null; int i = 0; if ((i = line.indexOf(oldString, i)) >= 0) { int counter = 1; char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = line.indexOf(oldString, i)) > 0; j = i) { counter++; buf.append(line2, j, i - j).append(newString2); i += oLength; } buf.append(line2, j, line2.length - j); count[0] = counter; return buf.toString(); } else { return line; } } /** * 检查一组字符串是否完全由中文组成 * * @param str * @return */ public static boolean isChinaLanguage(char[] chars) { int[] ints = new int[2]; boolean isChinese = false; int length = chars.length; byte[] bytes = null; for (int i = 0; i < length; i++) { bytes = ("" + chars[i]).getBytes(); if (bytes.length == 2) { ints[0] = bytes[0] & 0xff; ints[1] = bytes[1] & 0xff; if (ints[0] >= 0x81 && ints[0] <= 0xFE && ints[1] >= 0x40 && ints[1] <= 0xFE) { isChinese = true; } } else { return false; } } return isChinese; } public static boolean isChinese(char c) { return c >= 0x4e00 && c <= 0x9fa5; } /** * 判断是否为null * * @param param * @return */ public static boolean isEmpty(String param) { return param == null || param.length() == 0 || param.trim().equals(""); } /** * 检查指定字符串中是否存在中文字符。 * * @param checkStr * 指定需要检查的字符串。 * @return 逻辑值(True Or False)。 */ public static final boolean hasChinese(String checkStr) { boolean checkedStatus = false; boolean isError = false; String spStr = " _-"; int checkStrLength = checkStr.length() - 1; for (int i = 0; i <= checkStrLength; i++) { char ch = checkStr.charAt(i); if (ch < '\176') { ch = Character.toUpperCase(ch); if (((ch < 'A') || (ch > 'Z')) && ((ch < '0') || (ch > '9')) && (spStr.indexOf(ch) < 0)) { isError = true; } } } checkedStatus = !isError; return checkedStatus; } /** * 检查是否为纯字母 * * @param value * @return */ public final static boolean isAlphabet(String value) { if (value == null || value.length() == 0) { return false; } int count = 0; for (int i = 0; i < value.length(); i++) { char c = Character.toUpperCase(value.charAt(i)); if ('A' <= c && c <= 'Z') { count++; } } return count == value.length(); } /** * 检查是否为字母与数字混合 * * @param value * @return */ public static boolean isAlphabetNumeric(String value) { if (value == null || value.trim().length() == 0) return true; for (int i = 0; i < value.length(); i++) { char letter = value.charAt(i); if (('a' > letter || letter > 'z') && ('A' > letter || letter > 'Z') && ('0' > letter || letter > '9')) return false; } return true; } /** * 替换指定字符串 * * @param line * @param oldString * @param newString * @return */ public static String replaceMatch(String line, String oldString, String newString) { int i = 0; int j = 0; if ((i = line.indexOf(oldString, i)) >= 0) { char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buffer = new StringBuffer(line2.length); buffer.append(line2, 0, i).append(newString2); i += oLength; for (j = i; (i = line.indexOf(oldString, i)) > 0; j = i) { buffer.append(line2, j, i - j).append(newString2); i += oLength; } buffer.append(line2, j, line2.length - j); return buffer.toString(); } else { return line; } } /** * 获得特定字符总数 * * @param str * @param chr * @return */ public static int charCount(String str, char chr) { int count = 0; if (str != null) { int length = str.length(); for (int i = 0; i < length; i++) { if (str.charAt(i) == chr) { count++; } } return count; } return count; } /** * 批量转换字符串数组编码 * * @param s * @return */ public static String[] getString(String[] strs, String sourceEncoding, String objectEncoding) { String[] ss = new String[strs.length]; try { for (int i = 0; i < strs.length; i++) { byte[] aa = strs[i].getBytes(sourceEncoding); ss[i] = new String(aa, objectEncoding); } } catch (java.io.UnsupportedEncodingException e) { return null; } return ss; } public static byte[] getAsciiBytes(String data) { if (data == null) { throw new IllegalArgumentException("Parameter may not be null"); } try { return data.getBytes(ASCII_CHARSET); } catch (UnsupportedEncodingException e) { } throw new RuntimeException("LGame requires ASCII support"); } public static String getAsciiString(byte[] data, int offset, int length) { if (data == null) { throw new IllegalArgumentException("Parameter may not be null"); } try { return new String(data, offset, length, ASCII_CHARSET); } catch (UnsupportedEncodingException e) { } throw new RuntimeException("LGame requires ASCII support"); } public static String getAsciiString(byte[] data) { return getAsciiString(data, 0, data.length); } public static final boolean contains(String input, String pattern) { return contains(input, pattern, false); } public static final boolean contains(String input, String pattern, boolean ignoreCase) { final int n = pattern.length(); int last = 0; for (int i = 0; i < n;) { char c = ' '; int j = i; for (; j < n; j++) { char c2 = pattern.charAt(j); if (c2 == ' ' || c2 == '+' || c2 == '*') { c = c2; break; } } int k = subset(pattern, i, j, input, last, ignoreCase); if (k < 0) { return false; } if (c == ' ' || c == '+') { last = 0; } else if (c == '*') { last = k + j - i; } i = j + 1; } return true; } public static boolean containsCharacters(String input, char[] chars) { char[] inputChars = input.toCharArray(); Arrays.sort(inputChars); for (int i = 0; i < chars.length; i++) { if (Arrays.binarySearch(inputChars, chars[i]) >= 0) { return true; } } return false; } private static final int subset(String little, int littleStart, int littleStop, String big, int bigStart, boolean ignoreCase) { if (ignoreCase) { final int n = big.length() - (littleStop - littleStart) + 1; outerLoop: for (int i = bigStart; i < n; i++) { final int n2 = littleStop - littleStart; for (int j = 0; j < n2; j++) { char c1 = big.charAt(i + j); char c2 = little.charAt(littleStart + j); if (c1 != c2 && c1 != toOtherCase(c2)) { continue outerLoop; } } return i; } return -1; } else { final int n = big.length() - (littleStop - littleStart) + 1; outerLoop: for (int i = bigStart; i < n; i++) { final int n2 = littleStop - littleStart; for (int j = 0; j < n2; j++) { char c1 = big.charAt(i + j); char c2 = little.charAt(littleStart + j); if (c1 != c2) { continue outerLoop; } } return i; } return -1; } } public static final char toOtherCase(char c) { int i = c; final int A = 'A'; final int Z = 'Z'; final int a = 'a'; final int z = 'z'; final int SHIFT = a - A; if (i < A) { return c; } else if (i <= Z) { return (char) (i + SHIFT); } else if (i < a) { return c; } else if (i <= z) { return (char) (i - SHIFT); } else { return c; } } public static String[] splitNoCoalesce(String s, char delimiter) { return splitNoCoalesce(s, Character.toString(delimiter)); } public static String[] splitNoCoalesce(String s, String delimiters) { StringTokenizer tokenizer = new StringTokenizer(s, delimiters, true); ArrayList<String> tokens = new ArrayList<String>(); boolean gotDelimiter = true; while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (token.length() == 1 && delimiters.indexOf(token) >= 0) { if (gotDelimiter) { tokens.add(""); } gotDelimiter = true; } else { tokens.add(token); gotDelimiter = false; } } if (gotDelimiter && !tokens.isEmpty()) { tokens.add(""); } return tokens.toArray(new String[0]); } public static boolean startsWithIgnoreCase(String s, String prefix) { final int pl = prefix.length(); if (s.length() < pl) { return false; } for (int i = 0; i < pl; i++) { char sc = s.charAt(i); char pc = prefix.charAt(i); if (sc != pc) { sc = Character.toUpperCase(sc); pc = Character.toUpperCase(pc); if (sc != pc) { sc = Character.toLowerCase(sc); pc = Character.toLowerCase(pc); if (sc != pc) { return false; } } } } return true; } public static String truncate(final String string, final int maxLen) { if (string.length() <= maxLen) { return string; } else { return string.substring(0, maxLen); } } public static String removeDoubleSpaces(String s) { return s != null ? s.replaceAll("\\s+", " ") : null; } public static boolean isEmail(String emailStr) { Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(emailStr); return matcher.find(); } public static boolean isPhone(String phoneStr) { Matcher matcher = VALID_PHONE_REGEX.matcher(phoneStr); return matcher.find(); } }