All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.featherfly.common.lang.Strings Maven / Gradle / Ivy

package cn.featherfly.common.lang;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.featherfly.common.constant.Chars;
import cn.featherfly.common.constant.Unit;
import cn.featherfly.common.lang.string.StringFormatter;

/**
 * 字符串的工具类 .
 *
 * @author zhongj
 * @since 1.8.6
 */
public final class Strings extends org.apache.commons.lang3.StringUtils {

    private static final Pattern UNICODE_PATTERN = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");

    private static final StringFormatter FORMATTER = new StringFormatter(Chars.CURLY_L_CHAR, Chars.CURLY_R_CHAR);

    private Strings() {
    }

    /**
     * 

* null的字符串表示
* public static String NULL_STRING = "null" *

* . */ public static final String NULL_STRING = "null"; /** *

* 如果第一个为有效的字符串(不是null,空串),则返回,否则返回第二个. *

* * @param target 目标字符串 * @param defaultTarget 默认字符串 * @return 第一个为有效的字符串(null,空串),则返回,否则返回第二个 */ public static String pickNotEmpty(String target, String defaultTarget) { return isEmpty(target) ? defaultTarget : target; } /** *

* 如果第一个为有效的字符串(不是null,空串,全空白字符组成的字符串),则返回,否则返回第二个. *

* * @param target 目标字符串 * @param defaultTarget 默认字符串 * @return 第一个为有效的字符串(null,空串,全空白字符组成的字符串),则返回,否则返回第二个 */ public static String pickNotBlank(String target, String defaultTarget) { return isBlank(target) ? defaultTarget : target; } /** *

* 返回第一个有效的字符串(不是null,不是空字符串,不是由全空白字符组成的字符串) *

* . * * @param pickedItems 需要选择的字符串 * @return 返回第一个有效的字符串 */ public static String pickFirst(String... pickedItems) { if (pickedItems != null) { for (String s : pickedItems) { if (isNotBlank(s)) { return s; } } } return null; } /** *

* 返回最后一个有效字符串(不是null,不是空字符串,不是由全空白字符组成的字符串) *

* . * * @param pickedItems 需要选择的字符串 * @return 返回最后一个有效字符串 */ public static String pickLast(String... pickedItems) { if (pickedItems != null) { for (int i = pickedItems.length - 1; i >= 0; i--) { String s = pickedItems[i]; if (isNotBlank(s)) { return s; } } } return null; } /** * 如果为null,返回空字符串,否则返回传入字符串. * * @param str 需要判断的字符串 * @return 传入字符串或者空字符串 */ public static String getString(String str) { return getString(str, Chars.EMPTY_STR); } /** * 如果为null,空字符串,返回第二个参数,否则返回第一个参数. * * @param str 需要判断的字符串 * @param defValue 默认值 * @return 第一个参数或第二个参数 */ public static String getString(String str, String defValue) { return getString(str, defValue, true); } /** * 如果为null,空字符串,(当ignoreCaseNullStr为false,还要判断字符串"null"和"NULL") * 返回第二个参数,否则返回第一个参数. * * @param str 需要判断的字符串 * @param defValue 默认值 * @param ignoreCaseNullStr 是否忽略字符串形式的null和NULL * @return 第一个参数或第二个参数 */ public static String getString(String str, String defValue, boolean ignoreCaseNullStr) { if (str == null || "".equals(str)) { return defValue; } else if (!ignoreCaseNullStr && (NULL_STRING.equals(str) || NULL_STRING.toUpperCase().equals(str))) { return defValue; } else { return str; } } /** *

* 判断传入字符串数组是否为null,0长度或者全部是空字符串(即""和null). 只要有一个不是空字符串即返回真. *

* * @param strs 需要判断的字符串数组 * @return 传入是否是一个空字符串数组 */ public static boolean isEmpty(String[] strs) { for (String str : strs) { if (Lang.isNotEmpty(str)) { return false; } } return true; } /** *

* 判断传入字符串集合是否为null,0长度或者全部是空字符串(即""和null). 只要有一个不是空字符串即返回真. *

* * @param strs 需要判断的字符串集合 * @return 传入是否是一个空字符串集合 */ public static boolean isEmpty(Collection strs) { for (String str : strs) { if (Lang.isNotEmpty(str)) { return false; } } return true; } /** *

* 判断传入字符串是否是空字符串(即""和null) *

* . * * @param str 需要判断的字符串 * @return 传入字符串是否是空字符串 */ public static boolean isEmpty(String str) { return Lang.isEmpty(str); } /** *

* 判断传入字符串是否不是空字符串(即""和null以外的) *

* . * * @param str 需要判断的字符串 * @return 传入字符串是否不是空字符串 */ public static boolean isNotEmpty(String str) { return !isEmpty(str); } /** *

* 判断传入字符串是否不是空白字符串(即包含空白字符以外的字符) *

* . * * @param str 需要判断的字符串 * @return 传入字符串是否不是空白字符串 */ public static boolean isNotBlank(String str) { return !isBlank(str); } /** * 判断传入字符串是否为空以及是否为字符串null(不区分大小写). * * @param str 需要判断的字符串 * @return 是否为空以及是否为null字符串 */ public static boolean isNull(String str) { return isEmpty(str) || "NULL".equalsIgnoreCase(str.trim()); } /** *

* 去除字符串开始和结尾的空白字符. 如果传入的对象为null,直接返回,不会出现NullPointerException *

* * @param str 需要处理的字符串 * @return 去除开始和结尾空白字符后的字符串 */ public static String trim(String str) { if (str == null) { return str; } return str.trim(); } /** *

* 去除字符串开始和结尾的空白字符, 如果传入的对象为null,则返回defaultValue. *

* * @param str 需要处理的字符串 * @param defaultValue 默认值 * @return 去除开始和结尾空白字符后的字符串 */ public static String trim(String str, String defaultValue) { if (str == null) { return defaultValue; } return str.trim(); } /** *

* 去除字符串开始的空白字符 *

* . * * @param str 需要处理的字符串 * @return 去除开始空白字符后的字符串 */ public static String trimStart(String str) { if (isBlank(str)) { return ""; } char[] c = str.toCharArray(); int offset = 0; for (int i = 0; i < c.length; i++) { if (!Character.isWhitespace(c[i])) { offset = i; break; } } return new String(c, offset, c.length - offset); } /** *

* 去除字符串结尾的空白字符 *

* . * * @param str 需要处理的字符串 * @return 去除结尾空白字符的字符串 */ public static String trimEnd(String str) { if (isBlank(str)) { return ""; } char[] c = str.toCharArray(); int end = 0; for (int i = c.length; i > 0; i--) { if (!Character.isWhitespace(c[i - 1])) { end = i; break; } } return new String(c, 0, end); } /** *

* 判断传入的字符串是否为整数(使用10进制判断) *

* . * * @param str 需要判断的字符串 * @return 传入的字符串是否为整数 */ public static boolean isInteger(String str) { final int numberUnit = 10; return isInteger(str, numberUnit); } /** *

* 判断传入的字符串是否为整数(使用指定进制判断) *

* . * * @param str 需要判断的字符串 * @param radio 使用的进制 * @return 传入的字符串是否为整数 */ public static boolean isInteger(String str, int radio) { str = trim(str); try { Integer.parseInt(str, radio); return true; } catch (NumberFormatException e) { return false; } } /** *

* 将传入字符串以大写形式返回 *

* . * * @param str 需要转换的字符串 * @return 传入字符串的大写形式 */ public static String toUpperCase(String str) { if (isEmpty(str)) { return str; } else { return str.toUpperCase(); } } /** *

* 将传入字符串以小写形式返回 *

* . * * @param str 需要转换的字符串 * @return 传入字符串的小写形式 */ public static String toLowerCase(String str) { if (isEmpty(str)) { return str; } else { return str.toLowerCase(); } } /** * format str. * Strings.format("my name is {0}", "yufei"); * * * @param str format string * @param argu format argu * @return formated str */ public static String format(String str, Object argu) { return FORMATTER.format(str, new Object[] { argu }); } /** * format str. * Strings.format("my name is {0}, i am {1} years old", new Object[]{"yufei", 18}); * * * @param str format string * @param args format args * @return formated str */ public static String format(String str, Object... args) { return FORMATTER.format(str, args); } /** * format str. * Strings.format("my name is $0$, i am $1$ years old", '$', new Object[]{"yufei", 18}); * * * @param content the content * @param args format args * @param symbol the symbol * @return formated str */ public static String format(String content, Object[] args, char symbol) { return format(content, args, symbol, symbol); } /** * format str. * Strings.format("my name is {0}, i am {1} years old", '{', '}', new Object[]{"yufei", 18}); * * * @param content the content * @param args format args * @param startSymbol the start symbol * @param endSymbol the end symbol * @return formated str */ public static String format(String content, Object[] args, char startSymbol, char endSymbol) { return format(content, Lang.toMapStringKey(args), startSymbol, endSymbol); } /** * format str. * Strings.format("my name is:{name}, i am {age} years old", new * HashChainMap<String, String>().putChain("name", * "yufei").putChain("age", "18")); * * * @param content str content * @param args arg map * @return formated str */ public static String format(String content, Map args) { return FORMATTER.format(content, args); } /** * format str. * Strings.format("my name is:$name$, i am $age$ years old", new * HashChainMap<String, String>().putChain("name", * "yufei").putChain("age", "18"), '$'); * * * @param content the content * @param args the args * @param symbol the symbol * @return the string */ public static String format(String content, Map args, char symbol) { return format(content, args, symbol, symbol); } /** * format str. * Strings.format("my name is:{name}, i am {age} years old", new * HashChainMap<String, String>().putChain("name", * "yufei").putChain("age", "18"), '{', '}'); * * * @param content the content * @param args the args * @param startSymbol the start symbol * @param endSymbol the end symbol * @return the string */ public static String format(String content, Map args, char startSymbol, char endSymbol) { return new StringFormatter(startSymbol, endSymbol).format(content, args); } /** * format str. * User user = new User(); * user.setName("yufei"); * user.setAge(18); * StringFormatter formatter = new StringFormatter('{', '}'); * formatter.format("my name is {0}, i am {1} years old", user); * * * @param content the content * @param args format args * @return formated str */ public static String format2(String content, Object args) { return FORMATTER.format(content, args); } /** * format str. * User user = new User(); * user.setName("yufei"); * user.setAge(18); * Strings.format("my name is:$name$, i am $age$ years old", user , '$'); * * * @param content the content * @param args the args * @param symbol the symbol * @return the string */ public static String format(String content, Object args, char symbol) { return format(content, args, symbol, symbol); } /** * format str. * User user = new User(); * user.setName("yufei"); * user.setAge(18); * Strings.format("my name is:{name}, i am {age} years old", user, '{', '}'); * * * @param content the content * @param args the args * @param startSymbol the start symbol * @param endSymbol the end symbol * @return the string */ public static String format(String content, Object args, char startSymbol, char endSymbol) { return new StringFormatter(startSymbol, endSymbol).format(content, args); } /** *

* 文本替换 *

* . * * @param text 搜索的源 * @param searchString 搜索的内容 * @param replacement 替换的内容 * @return 替换完成的文本, 如果传入null返回null */ public static String replace(String text, String searchString, String replacement) { return replace(text, searchString, replacement, -1); } /** *

* null安全的判断两个字符串是否相等,如果两个都为null,返回true. *

* * @param str1 字符串1 * @param str2 字符串2 * @return 两个字符串是否相等 */ public static boolean isEquals(String str1, String str2) { if (str1 != null) { return str1.equals(str2); } if (str2 != null) { return str2.equals(str1); } return true; } /** *

* null安全的判断两个字符串是否相等,忽略大小写,如果两个都为null,返回true. *

* * @param str1 字符串1 * @param str2 字符串2 * @return 两个字符串是否相等 */ public static boolean isEqualsIgnoreCase(String str1, String str2) { if (str1 != null) { return str1.equalsIgnoreCase(str2); } if (str2 != null) { return str2.equalsIgnoreCase(str1); } return true; } /** * 连接集合中的所有元素以创建一个String,其中集合中的元素间以指定的delim来分隔, 如果 集合为null或长度为0,则返回"". * * @param collection 需要连接的String为元素的集合 * @param delim 集合中的元素的分隔符。(null表示直接连接集合中的元素,不加入分割符) * @return String 形式为:list的元素+delim+list的元素+delim+... */ public static String join(Collection collection, String delim) { if (Lang.isEmpty(collection)) { return ""; } StringBuilder sb = new StringBuilder(); Iterator iter = collection.iterator(); while (iter.hasNext()) { String strTemp = pickFirst(iter.next(), Chars.EMPTY_STR); sb.append(strTemp); if (iter.hasNext()) { sb.append(delim); } } return sb.toString(); } /** * 将字符串数组使用指定的分隔符合并成一个字符串. 如果数组为null或长度为0,则返回"". * * @param array 字符串数组 * @param delim 分隔符,为null的时候使用""作为分隔符(即没有分隔符) * @return 合并后的字符串 */ public static String join(String[] array, String delim) { if (Lang.isEmpty(array)) { return ""; } int length = array.length - 1; if (delim == null) { delim = ""; } StringBuilder result = new StringBuilder(length * Unit.TEN); for (int i = 0; i < length; i++) { result.append(array[i]); result.append(delim); } result.append(array[length]); return result.toString(); } /** * 以指定的delim分隔符分隔String,并将分隔的每一个String作为List的一个元素. * * @param source 需要分隔的string * @param delim 分隔String的符合 (null表示以空格作为分隔符) * @return 存储了分隔的子串的List */ public static List splitToList(String source, String delim) { List list = new ArrayList<>(); Collections.addAll(list, split(source, delim)); return list; } /** * 此方法将给出的字符串source使用delim划分为单词数组. * * @param source 需要进行划分的原字符串 * @param delim 单词的分隔字符串 * @return 划分以后的数组,如果source或delim为null的时候返回以source为唯一元素的数组. */ public static String[] split(String source, String delim) { String[] wordLists; if (source == null || delim == null) { wordLists = new String[1]; wordLists[0] = source; return wordLists; } StringTokenizer st = new StringTokenizer(source, delim); int total = st.countTokens(); wordLists = new String[total]; for (int i = 0; i < total; i++) { wordLists[i] = st.nextToken(); } return wordLists; } /** * 此方法将给出的字符串source使用逗号划分为单词数组. * * @param source 需要进行划分的原字符串 * @return 划分以后的数组,如果source为null的时候返回以source为唯一元素的数组。 */ public static String[] split(String source) { return split(source, Chars.COMMA); } /** * 将数转换成字符串数组,使用对象的toString方法. * * @param array 数组 * @return 转换后的字符串数组 */ public static String[] objectArrayToStringArray(Object[] array) { String[] strArray = null; if (array != null) { if (array.length < 1) { strArray = new String[0]; } else if (array instanceof String[]) { strArray = (String[]) array; } else { strArray = new String[array.length]; for (int i = 0; i < array.length; i++) { Object object = array[i]; if (object == null) { strArray[i] = null; } else { strArray[i] = object.toString(); } } } } return strArray; } /** * 删除String中的所有空格,并返回删除后的String. * * @param str 需要进行删除操作的String * @return String 删除空格后的String */ public static String removeSpaces(String str) { StringBuffer newString = new StringBuffer(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) != ' ') { newString.append(str.charAt(i)); } } return newString.toString(); } /** * 判断一个String里是不是包含另一个String. * * @param text 源文本 * @param searchString 包含的字符串 * @return 是否包含 */ public static boolean contains(String text, String searchString) { return text.indexOf(searchString) != -1; } /** * 字符串数组中是否包含指定的字符串.大小写敏感 * * @param texts 源文本数组 * @param searchString 包含的字符串 * @return 不包含,返回-1,如果包含,返回数组的下标数 */ public static int contains(String[] texts, String searchString) { return contains(texts, searchString, true); } /** * 不区分大小写判定字符串数组中是否包含指定的字符串。. * * @param texts 源文本数组 * @param searchString 包含的字符串 * @return 不包含,返回-1,如果包含,返回数组的下标数 */ public static int containsIgnoreCase(String[] texts, String searchString) { return contains(texts, searchString, false); } /* * 字符串数组中是否包含指定的字符串。 * @param texts 源文本数组 * @param searchString 包含的字符串 * @param caseSensitive 是否大小写敏感 * @return 不包含,返回-1,如果包含,返回数组的小标数 */ private static int contains(String[] texts, String searchString, boolean caseSensitive) { for (int i = 0; i < texts.length; i++) { if (caseSensitive) { if (texts[i].equals(searchString)) { return i; } } else { if (texts[i].equalsIgnoreCase(searchString)) { return i; } } } return -1; } /** * use ISO8859-1 as the input str charset, encode it to UTF-8. * * @param str encoding str * @return UTF-8 str */ public static String encode(String str) { return encode(str, StandardCharsets.UTF_8.displayName()); } /** * 将一个字符串进行转码处理,使用系统默认字符集解码并使用传入字符集进行编码. * * @param str 输入字符串 * @param charset 输出字符转编码时使用的字符集 * @return 输出转换后的字符串. */ public static String encode(String str, Charset charset) { return encode(str, StandardCharsets.ISO_8859_1, charset); } /** * 将一个字符串进行转码处理. * * @param str 输入字符串 * @param fromCharset 输入字符串解码时使用的字符集 * @param toCharset 输出字符转编码时使用的字符集 * @return 输出转换后的字符串. */ public static String encode(String str, java.nio.charset.Charset fromCharset, java.nio.charset.Charset toCharset) { if (isEmpty(str)) { return str; } fromCharset = Lang.pick(fromCharset, StandardCharsets.UTF_8); toCharset = Lang.pick(toCharset, StandardCharsets.UTF_8); if (fromCharset.equals(toCharset)) { return str; } return new String(str.getBytes(fromCharset), toCharset); } /** * 将一个字符串进行转码处理. * * @param str 输入字符串 * @param charsetName 输出字符转编码时使用的字符集 * @return 输出转换后的字符串. */ public static String encode(String str, String charsetName) { java.nio.charset.Charset charset = Lang.ifEmpty(charsetName, () -> StandardCharsets.UTF_8, () -> java.nio.charset.Charset.forName(charsetName)); return encode(str, charset); } /** * 将一个字符串进行转码处理. * * @param str 输入字符串 * @param fromCharsetName 输入字符串解码时使用的字符集 * @param toCharsetName 输出字符转编码时使用的字符集 * @return 输出转换后的字符串. */ public static String encode(String str, String fromCharsetName, String toCharsetName) { java.nio.charset.Charset fromCharset = Lang.ifEmpty(fromCharsetName, () -> StandardCharsets.UTF_8, () -> java.nio.charset.Charset.forName(fromCharsetName)); java.nio.charset.Charset toCharset = Lang.ifEmpty(toCharsetName, () -> StandardCharsets.UTF_8, () -> java.nio.charset.Charset.forName(toCharsetName)); return encode(str, fromCharset, toCharset); } /** * string2Unicode. * * @param string string * @return unicode_string */ public static String stringToUnicode(String string) { StringBuffer unicode = new StringBuffer(); for (int i = 0; i < string.length(); i++) { // 取出每一个字符 char c = string.charAt(i); // 转换为unicode unicode.append("\\u" + Integer.toHexString(c)); } return unicode.toString(); } /** * unicode2String. * * @param unicode unicode_string * @return string */ public static String unicodeToString(String unicode) { Matcher matcher = UNICODE_PATTERN.matcher(unicode); char ch; while (matcher.find()) { ch = (char) Integer.parseInt(matcher.group(2), Unit.SIXTEEN); unicode = unicode.replace(matcher.group(1), ch + ""); } return unicode; } /** * UTF-8编码. * * @param str 输入字符串 * @return 输出转换后的字符串. */ public static String toUTF8(String str) { return encode(str, StandardCharsets.UTF_8); } /** * UTF-8编码. * * @param str 输入字符串 * @param fromEncode 输入字符串解码时使用的字符集 * @return 输出转换后的字符串. */ public static String toUTF8(String str, String fromEncode) { return encode(str, fromEncode, StandardCharsets.UTF_8.displayName()); } /** * 将字符串转换为整型数. * * @param str 输入的字符串 * @param defaultValue 如果转换失败后的默认值 * @return 字符串转换为的整数 */ public static int toInt(String str, int defaultValue) { int returnInt = defaultValue; try { returnInt = Integer.parseInt(str); } catch (Exception e) { returnInt = defaultValue; } return returnInt; } /** * 将字符串转换为长整型数. * * @param str 输入的字符串 * @param defaultValue 如果转换失败后的默认值 * @return 字符串转换为的长整型数 */ public static long toLong(String str, long defaultValue) { long returnInt = defaultValue; try { returnInt = Long.parseLong(str); } catch (Exception e) { returnInt = defaultValue; } return returnInt; } /** * 将字符串转换为双精度数. * * @param str 输入的字符串 * @param defaultValue 如果转换失败后的默认值 * @return 字符串转换为的双精度数 */ public static double toDouble(String str, double defaultValue) { double returnInt = defaultValue; try { returnInt = Double.parseDouble(str); } catch (Exception e) { returnInt = defaultValue; } return returnInt; } /** * 将字符串转换为单精度数. * * @param str 输入的字符串 * @param defaultValue 如果转换失败后的默认值 * @return 字符串转换为的单精度数 */ public static float toFloat(String str, float defaultValue) { float returnInt = defaultValue; try { returnInt = Float.parseFloat(str); } catch (Exception e) { returnInt = defaultValue; } return returnInt; } /** * 获取传入字符串的长度,null返回0. * * @param str 字符串 * @return 传入字符串的长度,null返回0 */ public static int getLength(String str) { return getLength(str, false); } /** * 获取传入字符串的长度,null返回0. * * @param str 字符串 * @param needDeleteSpace 是否删除传入字符串的空字符串 * @return 传入字符串的长度,null返回0 */ public static int getLength(String str, boolean needDeleteSpace) { if (str == null) { return Chars.ZERO; } if (needDeleteSpace) { str = removeSpaces(str); return str.length(); } else { return str.length(); } } /** * 取字符串的前X个字符,X为传入参数. * * @param str 字符串 * @param index 序号 * @return 子串. */ public static String substringBefore(String str, int index) { if (isEmpty(str)) { return str; } if (str.length() <= index) { return str; } return str.substring(0, index); } /** * 取字符串从x开始后的字符,X为传入参数. * * @param str 字符串 * @param index 序号 * @return 子串. */ public static String substringAfter(String str, int index) { if (isEmpty(str)) { return str; } int length = str.length(); if (length <= index) { return str; } return str.substring(index + 1, length); } /** * 取字符串的后X个字符,X为传入参数. * * @param str 字符串 * @param length 长度 * @return 子串. */ public static String substringLast(String str, int length) { if (isEmpty(str)) { return str; } int len = str.length(); if (len <= length) { return str; } return str.substring(len - length); } /** * 判断字符串是否以指定字符串开始,如果需要判断的源文本为null,返回false. * * @param sourceString 源文本 * @param keyString 判断是否是起始的串 * @return 字符串是否以指定字符串开始 */ public static boolean startsWith(String sourceString, String keyString) { if (sourceString == null) { return false; } return sourceString.startsWith(keyString); } /** * 判断字符串是否以指定字符串结束,如果需要判断的源文本为null,返回false. * * @param sourceString 源文本 * @param keyString 判断是否是起始的串 * @return 字符串是否以指定字符串结束 */ public static boolean endWith(String sourceString, String keyString) { if (sourceString == null) { return false; } return sourceString.endsWith(keyString); } /** * 追加字符串,如果字符串为null,忽略. 如果两个字符串都为null,返回null. * * @param str1 原字符串 * @param str2 要追加的字符串 * @return 追加后的字符串 */ public static String append(String str1, String str2) { if (str1 == null) { return str2; } if (str2 == null) { return str1; } return str1 + str2; } /** * 去掉首尾字符. * * @param str 源字符串 * @param ts 需要去除的字符 * @return 去掉首尾字符后的字符串 */ public static String trimBeginEnd(String str, String ts) { if (str == null) { return ""; } while (str.startsWith(ts)) { str = str.substring(ts.length(), str.length()); } while (str.endsWith(ts)) { str = str.substring(0, str.length() - ts.length()); } return str; } /** * 去掉首尾空格,包括全角,半角. * * @param str 源字符串 * @return 去掉首尾空格后的字符串 */ public static String trimBeginEndBlank(String str) { if (str == null) { return ""; } str = str.trim(); str = trimBeginEnd(str, " "); str = trimBeginEnd(str, " "); return str; } /** * 将字符串中的变量(以“%”为前导后接数字)使用values数组中的内容进行替换。 * 替换的过程是不进行嵌套的,即如果替换的内容中包含变量表达式时不会替换。. * * @param source 带参数的原字符串 * @param values 替换用的字符串数组 * @return 替换后的字符串 */ public static String getReplaceString(String source, String... values) { return getReplaceString(Chars.MOD, source, values); } /** * 将字符串中的变量使用values数组中的内容进行替换。 替换的过程是不进行嵌套的,即如果替换的内容中包含变量表达式时不会替换。. * * @param prefix 变量前缀字符串 * @param source 带参数的原字符串 * @param values 替换用的字符串数组 * @return 替换后的字符串。 如果前缀为null则使用“%”作为前缀; * 如果source或者values为null或者values的长度为0则返回source; * 如果values的长度大于参数的个数,多余的值将被忽略; * 如果values的长度小于参数的个数,则后面的所有参数都使用最后一个值进行替换。 */ public static String getReplaceString(String prefix, String source, String[] values) { String result = source; if (source == null || values == null || values.length < 1) { return source; } if (prefix == null) { prefix = Chars.MOD; } for (int i = 0; i < values.length; i++) { String argument = prefix + Integer.toString(i + 1); int index = result.indexOf(argument); if (index != -1) { String temp = result.substring(0, index); if (i < values.length) { temp += values[i]; } else { temp += values[values.length - 1]; } temp += result.substring(index + 2); result = temp; } } return result; } /** * 过滤<, >, " 等html字符的方法。. * * @param str 需要过滤的字符串 * @return 完成过滤以后的字符串 */ public static String filterHtml(String str) { if (str == null) { return null; } if (str.length() == 0) { return str; } StringBuilder html = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); switch (c) { case '&': html.append("&"); break; case '<': html.append("<"); break; case '>': html.append(">"); break; case '\'': html.append("'"); break; case '\"': html.append("""); break; default: html.append(c); break; } } return html.toString(); } /** * 还原成html. * * @param str 需要转换的字符串 * @return 完成转换的html */ public static String toHtml(String str) { if (str == null) { return null; } if (str.length() == 0) { return str; } str = str.replaceAll("&", "&"); str = str.replaceAll("<", "<"); str = str.replaceAll(">", ">"); str = str.replaceAll("'", "'"); str = str.replaceAll(""", "\""); return str; } /** *

* 为传入URI附加请求参数 *

* . * * @param uri uri * @param name name * @param value value * @return 附加请求参数后的URI */ // TODO 是否应该移动到web public static String appendRequestParams(String uri, String name, String value) { if (Lang.isNotEmpty(uri)) { if (uri.contains(Chars.QUESTION)) { uri += Chars.AMP; } else { uri += Chars.QUESTION; } uri += name + "=" + value; } return uri; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy