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

dev.utils.common.StringUtils Maven / Gradle / Ivy

package dev.utils.common;

import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import dev.utils.DevFinal;
import dev.utils.JCLogUtils;

/**
 * detail: 字符串工具类
 * @author Ttt
 */
public final class StringUtils {

    private StringUtils() {
    }

    // 日志 TAG
    private static final String TAG = StringUtils.class.getSimpleName();

    // ==========
    // = String =
    // ==========

    /**
     * 判断字符串是否为 null
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEmpty(final CharSequence str) {
        return (str == null || str.length() == 0);
    }

    /**
     * 判断多个字符串是否存在为 null 的字符串
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEmpty(final CharSequence... args) {
        if (args != null && args.length != 0) {
            for (CharSequence value : args) {
                if (isEmpty(value)) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }

    /**
     * 判断字符串是否为 null ( 调用 clearSpaceTabLineTrim )
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEmptyClear(final String str) {
        return isEmpty(clearSpaceTabLineTrim(str));
    }

    /**
     * 判断多个字符串是否存在为 null 的字符串 ( 调用 clearSpaceTabLineTrim )
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEmptyClear(final String... args) {
        if (args != null && args.length != 0) {
            for (String value : args) {
                if (isEmptyClear(value)) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }

    // =

    /**
     * 判断字符串是否不为 null
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNotEmpty(final CharSequence str) {
        return (str != null && str.length() != 0);
    }

    /**
     * 判断字符串是否不为 null ( 调用 clearSpaceTabLineTrim )
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNotEmptyClear(final String str) {
        return isNotEmpty(clearSpaceTabLineTrim(str));
    }

    // ========
    // = Null =
    // ========

    /**
     * 判断字符串是否为 "null"
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNull(final String str) {
        return isEmpty(str) || DevFinal.SYMBOL.NULL.equalsIgnoreCase(str);
    }

    /**
     * 判断多个字符串是否存在为 "null" 的字符串
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNull(final String... args) {
        if (args != null && args.length != 0) {
            for (String value : args) {
                if (isNull(value)) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }

    /**
     * 判断字符串是否为 "null" ( 调用 clearSpaceTabLineTrim )
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNullClear(final String str) {
        return isNull(clearSpaceTabLineTrim(str));
    }

    /**
     * 判断多个字符串是否存在为 "null" 的字符串 ( 调用 clearSpaceTabLineTrim )
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNullClear(final String... args) {
        if (args != null && args.length != 0) {
            for (String value : args) {
                if (isNullClear(value)) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }

    // =

    /**
     * 判断字符串是否不为 "null"
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNotNull(final String str) {
        return !isNull(str);
    }

    /**
     * 判断字符串是否不为 "null" ( 调用 clearSpaceTabLineTrim )
     * @param str 待校验的字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isNotNullClear(final String str) {
        return isNotNull(clearSpaceTabLineTrim(str));
    }

    // ==========
    // = 判断长度 =
    // ==========

    /**
     * 获取字符串长度
     * @param str 待校验的字符串
     * @return 字符串长度, 如果字符串为 null, 则返回 0
     */
    public static int length(final String str) {
        return str == null ? 0 : str.length();
    }

    /**
     * 获取字符串长度
     * @param str           待校验的字符串
     * @param defaultLength 字符串为 null 时, 返回的长度
     * @return 字符串长度, 如果字符串为 null, 则返回 defaultLength
     */
    public static int length(
            final String str,
            final int defaultLength
    ) {
        return str != null ? str.length() : defaultLength;
    }

    // =

    /**
     * 获取字符串长度 是否等于期望长度
     * @param str    待校验的字符串
     * @param length 期望长度
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isLength(
            final String str,
            final int length
    ) {
        return str != null && str.length() == length;
    }

    // ==========
    // = 对比判断 =
    // ==========

    /**
     * 判断两个值是否一样
     * @param value1 第一个值
     * @param value2 第二个值
     * @param     泛型
     * @return {@code true} yes, {@code false} no
     */
    public static  boolean equals(
            final T value1,
            final T value2
    ) {
        return ObjectUtils.equals(value1, value2);
    }

    /**
     * 判断两个值是否一样 ( 非 null 判断 )
     * @param value1 第一个值
     * @param value2 第二个值
     * @param     泛型
     * @return {@code true} yes, {@code false} no
     */
    public static  boolean equalsNotNull(
            final T value1,
            final T value2
    ) {
        return value1 != null && ObjectUtils.equals(value1, value2);
    }

    /**
     * 判断两个值是否一样 ( 忽略大小写 )
     * @param value1 第一个值
     * @param value2 第二个值
     * @return {@code true} yes, {@code false} no
     */
    public static boolean equalsIgnoreCase(
            final String value1,
            final String value2
    ) {
        if (value1 != null) {
            return value1.equalsIgnoreCase(value2);
        } else {
            return value2 == null;
        }
    }

    /**
     * 判断两个值是否一样 ( 忽略大小写 )
     * @param value1 第一个值
     * @param value2 第二个值
     * @return {@code true} yes, {@code false} no
     */
    public static boolean equalsIgnoreCaseNotNull(
            final String value1,
            final String value2
    ) {
        return value1 != null && equalsIgnoreCase(value1, value2);
    }

    // =

    /**
     * 判断多个字符串是否相等, 只有全相等才返回 true ( 对比大小写 )
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEquals(final String... args) {
        return isEquals(false, args);
    }

    /**
     * 判断多个字符串是否相等, 只有全相等才返回 true
     * @param isIgnore 是否忽略大小写
     * @param args     待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEquals(
            final boolean isIgnore,
            final String... args
    ) {
        if (args != null) {
            String last = null;
            // 获取数据长度
            int len = args.length;
            // 如果最多只有一个数据判断, 则直接跳过
            if (len <= 1) {
                return false;
            }
            for (String value : args) {
                // 如果等于 null, 则跳过
                if (value == null) {
                    return false;
                }
                if (last != null) {
                    if (isIgnore) {
                        if (!value.equalsIgnoreCase(last)) {
                            return false;
                        }
                    } else {
                        if (!value.equals(last)) {
                            return false;
                        }
                    }
                }
                last = value;
            }
            return true;
        }
        return false;
    }

    /**
     * 判断多个字符串, 只要有一个符合条件则通过
     * @param str  待校验的字符串
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isOrEquals(
            final String str,
            final String... args
    ) {
        return isOrEquals(false, str, args);
    }

    /**
     * 判断多个字符串, 只要有一个符合条件则通过
     * @param isIgnore 是否忽略大小写
     * @param str      待校验的字符串
     * @param args     待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isOrEquals(
            final boolean isIgnore,
            final String str,
            final String... args
    ) {
        if (str != null && args != null && args.length != 0) {
            for (String value : args) {
                if (isIgnore) {
                    if (str.equalsIgnoreCase(value)) {
                        return true;
                    }
                } else {
                    if (str.equals(value)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    /**
     * 判断一堆值中, 是否存在符合该条件的 ( 包含 )
     * @param str  待校验的字符串
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isContains(
            final String str,
            final String... args
    ) {
        return isContains(false, str, args);
    }

    /**
     * 判断一堆值中, 是否存在符合该条件的 ( 包含 )
     * @param isIgnore 是否忽略大小写
     * @param str      待校验的字符串
     * @param args     待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isContains(
            final boolean isIgnore,
            final String str,
            final String... args
    ) {
        if (str != null && args != null && args.length != 0) {
            String tempString = str;
            // 判断是否需要忽略大小写
            if (isIgnore) {
                tempString = tempString.toLowerCase();
            }
            // 获取内容长度
            int strLength = tempString.length();
            // 遍历判断
            for (String value : args) {
                // 判断是否为 null, 或者长度为 0
                if (!isEmpty(value) && strLength != 0) {
                    if (isIgnore) {
                        // 转换小写
                        String valIgnore = value.toLowerCase();
                        // 判断是否包含
                        if (valIgnore.contains(tempString)) {
                            return true;
                        }
                    } else {
                        // 判断是否包含
                        if (value.contains(tempString)) {
                            return true;
                        }
                    }
                } else {
                    if (tempString.equals(value)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    /**
     * 判断内容, 是否属于特定字符串开头 ( 对比大小写 )
     * @param str  待校验的字符串
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isStartsWith(
            final String str,
            final String... args
    ) {
        return isStartsWith(false, str, args);
    }

    /**
     * 判断内容, 是否属于特定字符串开头
     * @param isIgnore 是否忽略大小写
     * @param str      待校验的字符串
     * @param args     待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isStartsWith(
            final boolean isIgnore,
            final String str,
            final String... args
    ) {
        if (!isEmpty(str) && args != null && args.length != 0) {
            String tempString = str;
            // 判断是否需要忽略大小写
            if (isIgnore) {
                tempString = tempString.toLowerCase();
            }
            for (String value : args) {
                // 判断是否为 null, 或者长度为 0
                if (!isEmpty(value)) {
                    if (isIgnore) {
                        // 转换小写
                        String valIgnore = value.toLowerCase();
                        // 判断是否属于 val 开头
                        if (tempString.startsWith(valIgnore)) {
                            return true;
                        }
                    } else {
                        // 判断是否属于 val 开头
                        if (tempString.startsWith(value)) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }

    /**
     * 判断内容, 是否属于特定字符串结尾 ( 对比大小写 )
     * @param str  待校验的字符串
     * @param args 待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEndsWith(
            final String str,
            final String... args
    ) {
        return isEndsWith(false, str, args);
    }

    /**
     * 判断内容, 是否属于特定字符串结尾
     * @param isIgnore 是否忽略大小写
     * @param str      待校验的字符串
     * @param args     待校验的字符串数组
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isEndsWith(
            final boolean isIgnore,
            final String str,
            final String... args
    ) {
        if (!isEmpty(str) && args != null && args.length != 0) {
            String tempString = str;
            // 判断是否需要忽略大小写
            if (isIgnore) {
                tempString = tempString.toLowerCase();
            }
            for (String value : args) {
                // 判断是否为 null, 或者长度为 0
                if (!isEmpty(value)) {
                    if (isIgnore) {
                        // 转换小写
                        String valIgnore = value.toLowerCase();
                        // 判断是否属于 val 结尾
                        if (tempString.endsWith(valIgnore)) {
                            return true;
                        }
                    } else {
                        // 判断是否属于 val 结尾
                        if (tempString.endsWith(value)) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }

    /**
     * 统计字符串匹配个数
     * @param str     待匹配字符串
     * @param keyword 匹配 key
     * @return 字符串 key 匹配个数
     */
    public static int countMatches(
            final String str,
            final String keyword
    ) {
        if (isEmpty(str) || isEmpty(keyword)) return 0;
        try {
            int     count   = 0;
            Matcher matcher = Pattern.compile(keyword).matcher(str);
            // find() 对字符串进行匹配, 匹配到的字符串可以在任何位置
            while (matcher.find()) {
                count++;
            }
            return count;
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "countMatches");
        }
        return -1;
    }

    /**
     * 统计字符串匹配个数
     * @param str     待匹配字符串
     * @param keyword 匹配 key
     * @return 字符串 key 匹配个数
     */
    public static int countMatches2(
            final String str,
            final String keyword
    ) {
        if (isEmpty(str) || isEmpty(keyword)) return 0;
        try {
            // 获取匹配 key 长度
            int keyLength = keyword.length();
            // =
            int count = 0, index = 0;
            while ((index = str.indexOf(keyword, index)) != -1) {
                index = index + keyLength;
                count++;
            }
            return count;
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "countMatches2");
        }
        return -1;
    }

    // ==========
    // = 其他处理 =
    // ==========

    /**
     * 判断字符串是否为 null 或全为空白字符
     * @param str 待校验字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isSpace(final CharSequence str) {
        if (str == null) return true;
        for (int i = 0, len = str.length(); i < len; ++i) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 字符串 转 byte[]
     * @param str 待处理字符串
     * @return byte[]
     */
    public static byte[] getBytes(final String str) {
        return (str != null) ? str.getBytes() : null;
    }

    // =

    /**
     * 清空字符串全部空格
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearSpace(final String str) {
        return replaceAll(str, DevFinal.SYMBOL.SPACE, "");
    }

    /**
     * 清空字符串全部 Tab
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearTab(final String str) {
        return replaceAll(str, DevFinal.SYMBOL.TAB, "");
    }

    /**
     * 清空字符串全部换行符
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearLine(final String str) {
        return replaceAll(str, DevFinal.SYMBOL.NEW_LINE, "");
    }

    /**
     * 清空字符串全部换行符
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearLine2(final String str) {
        return replaceAll(str, DevFinal.SYMBOL.NL, "");
    }

    // =

    /**
     * 清空字符串前后全部空格
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearSpaceTrim(final String str) {
        return clearSEWiths(str, DevFinal.SYMBOL.SPACE);
    }

    /**
     * 清空字符串前后全部 Tab
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearTabTrim(final String str) {
        return clearSEWiths(str, DevFinal.SYMBOL.TAB);
    }

    /**
     * 清空字符串前后全部换行符
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearLineTrim(final String str) {
        return clearSEWiths(str, DevFinal.SYMBOL.NEW_LINE);
    }

    /**
     * 清空字符串前后全部换行符
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearLineTrim2(final String str) {
        return clearSEWiths(str, DevFinal.SYMBOL.NL);
    }

    /**
     * 清空字符串全部空格、Tab、换行符
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearSpaceTabLine(final String str) {
        if (isEmpty(str)) return str;
        String value = clearSpace(str);
        value = clearTab(value);
        value = clearLine(value);
        value = clearLine2(value);
        return value;
    }

    /**
     * 清空字符串前后全部空格、Tab、换行符
     * @param str 待处理字符串
     * @return 处理后的字符串
     */
    public static String clearSpaceTabLineTrim(final String str) {
        if (isEmpty(str)) return str;
        String value = str;
        while (true) {
            boolean space = (value.startsWith(DevFinal.SYMBOL.SPACE) || value.endsWith(DevFinal.SYMBOL.SPACE));
            if (space) value = clearSpaceTrim(value);

            boolean tab = (value.startsWith(DevFinal.SYMBOL.TAB) || value.endsWith(DevFinal.SYMBOL.TAB));
            if (tab) value = clearTabTrim(value);

            boolean line = (value.startsWith(DevFinal.SYMBOL.NEW_LINE) || value.endsWith(DevFinal.SYMBOL.NEW_LINE));
            if (line) value = clearLineTrim(value);

            boolean line2 = (value.startsWith(DevFinal.SYMBOL.NL) || value.endsWith(DevFinal.SYMBOL.NL));
            if (line2) value = clearLineTrim2(value);

            // 都不存在则返回值
            if (!space && !tab && !line && !line2) return value;
        }
    }

    // =

    /**
     * 追加空格
     * @param number 空格数量
     * @return 指定数量的空格字符串
     */
    public static String appendSpace(final int number) {
        return forString(number, DevFinal.SYMBOL.SPACE);
    }

    /**
     * 追加 Tab
     * @param number tab 键数量
     * @return 指定数量的 Tab 字符串
     */
    public static String appendTab(final int number) {
        return forString(number, DevFinal.SYMBOL.TAB);
    }

    /**
     * 追加换行
     * @param number 换行数量
     * @return 指定数量的换行字符串
     */
    public static String appendLine(final int number) {
        return forString(number, DevFinal.SYMBOL.NEW_LINE);
    }

    /**
     * 追加换行
     * @param number 换行数量
     * @return 指定数量的换行字符串
     */
    public static String appendLine2(final int number) {
        return forString(number, DevFinal.SYMBOL.NL);
    }

    /**
     * 循环指定数量字符串
     * @param number 空格数量
     * @param str    待追加字符串
     * @return 指定数量字符串
     */
    public static String forString(
            final int number,
            final String str
    ) {
        StringBuilder builder = new StringBuilder();
        if (number > 0) {
            for (int i = 0; i < number; i++) {
                builder.append(str);
            }
        }
        return builder.toString();
    }

    /**
     * 循环拼接
     * @param delimiter 拼接符号
     * @param values    待拼接对象
     * @return 拼接后的值
     */
    public static String joinArgs(
            final Object delimiter,
            final Object... values
    ) {
        if (values != null) {
            int length = values.length;
            if (length != 0) {
                StringBuilder builder = new StringBuilder();
                builder.append(values[0]);
                for (int i = 1; i < length; i++) {
                    builder.append(delimiter);
                    builder.append(values[i]);
                }
                return builder.toString();
            }
        }
        return null;
    }

    /**
     * 循环拼接
     * @param delimiter 拼接符号
     * @param values    待拼接对象
     * @return 拼接后的值
     */
    public static String join(
            final Object delimiter,
            final Object[] values
    ) {
        if (values != null) {
            int length = values.length;
            if (length != 0) {
                StringBuilder builder = new StringBuilder();
                builder.append(values[0]);
                for (int i = 1; i < length; i++) {
                    builder.append(delimiter);
                    builder.append(values[i]);
                }
                return builder.toString();
            }
        }
        return null;
    }

    /**
     * 循环拼接
     * @param delimiter 拼接符号
     * @param iterable  待拼接对象
     * @return 拼接后的值
     */
    public static String join(
            final Object delimiter,
            final Iterable iterable
    ) {
        if (iterable != null) {
            final Iterator it = iterable.iterator();
            if (!it.hasNext()) {
                return "";
            }
            StringBuilder builder = new StringBuilder();
            builder.append(it.next());
            while (it.hasNext()) {
                builder.append(delimiter);
                builder.append(it.next());
            }
            return builder.toString();
        }
        return null;
    }

    /**
     * 冒号分割处理
     * @param str 待处理字符串
     * @return 冒号分割后的字符串
     */
    public static String colonSplit(final String str) {
        if (!isEmpty(str)) {
            return str.replaceAll("(?<=[0-9A-F]{2})[0-9A-F]{2}", ":$0");
        }
        return str;
    }

    // =

    /**
     * 获取字符串 ( 判 null )
     * @param str 待校验的字符串
     * @return 校验后的字符串
     */
    public static String getString(final String str) {
        return getString(str, DevFinal.SYMBOL.NULL);
    }

    /**
     * 获取字符串 ( 判 null )
     * @param str        待校验的字符串
     * @param defaultStr 默认字符串
     * @return 校验后的字符串
     */
    public static String getString(
            final String str,
            final String defaultStr
    ) {
        return str != null ? str : defaultStr;
    }

    /**
     * 获取字符串 ( 判 null )
     * @param object 待校验的对象
     * @return 校验后的字符串
     */
    public static String getString(final Object object) {
        return getString(object, DevFinal.SYMBOL.NULL);
    }

    /**
     * 获取字符串 ( 判 null )
     * @param object     待校验的对象
     * @param defaultStr 默认字符串
     * @return 校验后的字符串
     */
    public static String getString(
            final Object object,
            final String defaultStr
    ) {
        return object != null ? object.toString() : defaultStr;
    }

    /**
     * 检查字符串
     * @param str 待校验字符串
     * @return 如果待校验字符串为 null, 则返回默认字符串, 如果不为 null, 则返回该字符串
     */
    public static String checkValue(final String str) {
        return checkValue("", str);
    }

    /**
     * 检查字符串
     * @param defaultStr 默认字符串
     * @param str        待校验字符串
     * @return 如果待校验字符串为 null, 则返回 defaultStr, 如果不为 null, 则返回该字符串
     */
    public static String checkValue(
            final String defaultStr,
            final String str
    ) {
        return isEmpty(str) ? defaultStr : str;
    }

    /**
     * 检查字符串 ( 单独检查两个值 )
     * @param defaultStr 默认字符串
     * @param value1     第一个待校验字符串
     * @param value2     第二个待校验字符串
     * @return 两个待校验字符串中不为 null 的字符串, 如果都为 null, 则返回 defaultStr
     */
    public static String checkValue(
            final String defaultStr,
            final String value1,
            final String value2
    ) {
        if (isEmpty(value1)) {
            if (isEmpty(value2)) {
                return defaultStr;
            } else {
                return value2;
            }
        } else {
            return value1;
        }
    }

    /**
     * 检查字符串 ( 多个值 )
     * @param defaultStr 默认字符串
     * @param args       待校验字符串数组
     * @return 字符串数组中不为 null 的字符串, 如果都为 null, 则返回 defaultStr
     */
    public static String checkValues(
            final String defaultStr,
            final String... args
    ) {
        if (args != null && args.length != 0) {
            for (String value : args) {
                if (!isEmpty(value)) {
                    return value;
                }
            }
        }
        return defaultStr;
    }

    /**
     * 检查字符串 ( 多个值, 删除前后空格对比判断 )
     * @param defaultStr 默认字符串
     * @param args       待校验字符串数组
     * @return 字符串数组中不为 null 的字符串, 如果都为 null, 则返回 defaultStr
     */
    public static String checkValuesSpace(
            final String defaultStr,
            final String... args
    ) {
        if (args != null && args.length != 0) {
            for (String value : args) {
                // 删除前后空格处理后, 进行返回
                String result = clearSpaceTrim(value);
                if (!isEmpty(result)) {
                    return result;
                }
            }
        }
        return defaultStr;
    }

    // ===============
    // = 数据格式化处理 =
    // ===============

    /**
     * 字符串格式化
     * @param format 待格式化字符串
     * @param args   格式化参数
     * @return 格式化后的字符串
     */
    public static String format(
            final String format,
            final Object... args
    ) {
        if (format == null) return null;
        try {
            if (args != null && args.length != 0) {
                return String.format(format, args);
            } else {
                return format;
            }
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "format");
        }
        return null;
    }

    /**
     * 根据可变参数数量自动格式化
     * @param args 格式化参数
     * @return 格式化后的字符串
     */
    public static String argsFormat(final Object... args) {
        return FormatUtils.argsOf("%s", " %s").format(args);
    }

    // =

    /**
     * 字符串连接, 将参数列表拼接为一个字符串
     * @param args 追加数据
     * @return 拼接后的字符串
     */
    public static String concat(final Object... args) {
        return concatSpiltWith("", args);
    }

    /**
     * 字符串连接, 将参数列表拼接为一个字符串
     * @param split 追加间隔
     * @param args  追加数据
     * @return 拼接后的字符串
     */
    public static String concatSpiltWith(
            final String split,
            final Object... args
    ) {
        if (args == null) return null;
        StringBuilder builder = new StringBuilder();
        if (isEmpty(split)) {
            for (Object value : args) {
                builder.append(value);
            }
        } else {
            for (Object value : args) {
                builder.append(value).append(split);
            }
        }
        return builder.toString();
    }

    /**
     * 字符串连接, 将参数列表拼接为一个字符串 ( 最后一个不追加间隔 )
     * @param split 追加间隔
     * @param args  追加数据
     * @return 拼接后的字符串
     */
    public static String concatSpiltWithIgnoreLast(
            final String split,
            final Object... args
    ) {
        if (args == null) return null;
        StringBuilder builder = new StringBuilder();
        int           len     = args.length;
        if (len > 0) {
            if (isEmpty(split)) {
                for (Object value : args) {
                    builder.append(value);
                }
            } else {
                for (int i = 0; i < len - 1; i++) {
                    builder.append(args[i]).append(split);
                }
                builder.append(args[len - 1]);
            }
        }
        return builder.toString();
    }

    /**
     * StringBuilder 拼接处理
     * @param builder 拼接 Builder
     * @param split   追加间隔
     * @param args    拼接数据源
     * @return {@link StringBuilder}
     */
    public static StringBuilder appends(
            final StringBuilder builder,
            final String split,
            final Object... args
    ) {
        if (builder != null && args != null) {
            if (isEmpty(split)) {
                for (Object value : args) {
                    builder.append(value);
                }
            } else {
                for (Object value : args) {
                    builder.append(value).append(split);
                }
            }
        }
        return builder;
    }

    /**
     * StringBuilder 拼接处理 ( 最后一个不追加间隔 )
     * @param builder 拼接 Builder
     * @param split   追加间隔
     * @param args    拼接数据源
     * @return {@link StringBuilder}
     */
    public static StringBuilder appendsIgnoreLast(
            final StringBuilder builder,
            final String split,
            final Object... args
    ) {
        if (builder != null && args != null) {
            int len = args.length;
            if (len > 0) {
                if (isEmpty(split)) {
                    for (Object value : args) {
                        builder.append(value);
                    }
                } else {
                    for (int i = 0; i < len - 1; i++) {
                        builder.append(args[i]).append(split);
                    }
                    builder.append(args[len - 1]);
                }
            }
        }
        return builder;
    }

    // ==========
    // = 转换处理 =
    // ==========

    /**
     * 字符串进行 GBK 编码
     * @param str 待处理字符串
     * @return GBK 编码后的字符串
     */
    public static String gbkEncode(final String str) {
        return strEncode(str, DevFinal.ENCODE.GBK);
    }

    /**
     * 字符串进行 GBK2312 编码
     * @param str 待处理字符串
     * @return GBK2312 编码后的字符串
     */
    public static String gbk2312Encode(final String str) {
        return strEncode(str, DevFinal.ENCODE.GBK_2312);
    }

    /**
     * 字符串进行 UTF-8 编码
     * @param str 待处理字符串
     * @return UTF-8 编码后的字符串
     */
    public static String utf8Encode(final String str) {
        return strEncode(str, DevFinal.ENCODE.UTF_8);
    }

    /**
     * 进行字符串编码
     * @param str 待处理字符串
     * @param enc 编码格式
     * @return 指定编码格式编码后的字符串
     */
    public static String strEncode(
            final String str,
            final String enc
    ) {
        if (str == null || enc == null) return null;
        try {
            return new String(str.getBytes(), enc);
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "strEncode");
        }
        return str;
    }

    // =

    /**
     * 进行 URL 编码, 默认 UTF-8
     * @param str 待处理字符串
     * @return UTF-8 编码格式 URL 编码后的字符串
     */
    public static String urlEncode(final String str) {
        return urlEncode(str, DevFinal.ENCODE.UTF_8);
    }

    /**
     * 进行 URL 编码
     * @param str 待处理字符串
     * @param enc 编码格式
     * @return 指定编码格式 URL 编码后的字符串
     */
    public static String urlEncode(
            final String str,
            final String enc
    ) {
        if (str == null || enc == null) return null;
        try {
            return URLEncoder.encode(str, enc);
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "urlEncode");
        }
        return null;
    }

    // =

    /**
     * 进行 URL 解码, 默认 UTF-8
     * @param str 待处理字符串
     * @return UTF-8 编码格式 URL 解码后的字符串
     */
    public static String urlDecode(final String str) {
        return urlDecode(str, DevFinal.ENCODE.UTF_8);
    }

    /**
     * 进行 URL 解码
     * @param str 待处理字符串
     * @param enc 解码格式
     * @return 指定编码格式 URL 解码后的字符串
     */
    public static String urlDecode(
            final String str,
            final String enc
    ) {
        if (str == null || enc == null) return null;
        try {
            return URLDecoder.decode(str, enc);
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "urlDecode");
        }
        return null;
    }

    // =

    /**
     * 进行 URL 解码, 默认 UTF-8 ( 循环到非 URL 编码为止 )
     * @param str       待处理字符串
     * @param threshold 解码次数阈值, 超过该次数还未完成则直接返回
     * @return UTF-8 编码格式 URL 解码后的字符串
     */
    public static String urlDecodeWhile(
            final String str,
            final int threshold
    ) {
        return urlDecodeWhile(str, DevFinal.ENCODE.UTF_8, threshold);
    }

    /**
     * 进行 URL 解码 ( 循环到非 URL 编码为止 )
     * @param str       待处理字符串
     * @param enc       解码格式
     * @param threshold 解码次数阈值, 超过该次数还未完成则直接返回
     * @return 指定编码格式 URL 解码后的字符串
     */
    public static String urlDecodeWhile(
            final String str,
            final String enc,
            final int threshold
    ) {
        if (str == null || enc == null) return null;
        int    count       = Math.max(threshold, 1);
        int    number      = 0;
        String result      = str;
        String decodeValue = StringUtils.urlDecode(str, enc);
        while (true) {
            // 如果相同则直接返回
            if (result.equals(decodeValue)) {
                return decodeValue;
            }
            if (decodeValue == null) return result;
            result      = decodeValue;
            decodeValue = StringUtils.urlDecode(result, enc);
            // 判断循环次数
            number++;
            if (number > count) {
                if (decodeValue != null) {
                    return decodeValue;
                } else {
                    return result;
                }
            }
        }
    }

    // =

    /**
     * 将字符串转移为 ASCII 码
     * @param str 待处理字符串
     * @return 字符串转 ASCII 码后的字符串
     */
    public static String ascii(final String str) {
        if (isEmpty(str)) return str;
        try {
            StringBuilder builder = new StringBuilder();
            byte[]        bytes   = str.getBytes();
            for (byte value : bytes) {
                builder.append(Integer.toHexString(value & 0xff));
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "ascii");
        }
        return null;
    }

    /**
     * 将字符串转移为 Unicode 码
     * @param str 待处理字符串
     * @return 字符串转 Unicode 码后的字符串
     */
    public static String unicode(final String str) {
        if (isEmpty(str)) return str;
        try {
            StringBuilder builder = new StringBuilder();
            char[]        chars   = str.toCharArray();
            for (char value : chars) {
                builder.append("\\u").append(Integer.toHexString(value));
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "unicode");
        }
        return null;
    }

    /**
     * 将字符数组转移为 Unicode 码
     * @param chars char[]
     * @return char[] 转 Unicode 码后的字符串
     */
    public static String unicodeString(final char[] chars) {
        if (chars == null) return null;
        try {
            StringBuilder builder = new StringBuilder();
            for (char value : chars) {
                builder.append("\\u").append(Integer.toHexString(value));
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "unicodeString");
        }
        return null;
    }

    /**
     * 转化为半角字符
     * @param str 待处理字符串
     * @return 转换半角字符串
     */
    public static String dbc(final String str) {
        if (isEmpty(str)) return str;
        char[] chars = str.toCharArray();
        for (int i = 0, len = chars.length; i < len; i++) {
            if (chars[i] == 12288) {
                chars[i] = ' ';
            } else if (65281 <= chars[i] && chars[i] <= 65374) {
                chars[i] = (char) (chars[i] - 65248);
            } else {
                chars[i] = chars[i];
            }
        }
        return new String(chars);
    }

    /**
     * 转化为全角字符 如: a = a, A = A
     * @param str 待处理字符串
     * @return 转换全角字符串
     */
    public static String sbc(final String str) {
        if (isEmpty(str)) return str;
        char[] chars = str.toCharArray();
        for (int i = 0, len = chars.length; i < len; i++) {
            if (chars[i] == ' ') {
                chars[i] = (char) 12288;
            } else if (33 <= chars[i] && chars[i] <= 126) {
                chars[i] = (char) (chars[i] + 65248);
            } else {
                chars[i] = chars[i];
            }
        }
        return new String(chars);
    }

    // =

    /**
     * 检测字符串是否全是中文
     * @param str 待校验字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean checkChineseToString(final String str) {
        if (isEmpty(str)) return false;
        boolean result = true;
        char[]  chars  = str.toCharArray();
        for (char value : chars) {
            if (!isChinese(value)) {
                result = false;
                break;
            }
        }
        return result;
    }

    /**
     * 判断输入汉字
     * @param ch 待校验字符
     * @return {@code true} yes, {@code false} no
     */
    public static boolean isChinese(final char ch) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(ch);
        return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS;
    }

    // ===============
    // = 字符串处理方法 =
    // ===============

    /**
     * 首字母大写
     * @param str 待处理字符串
     * @return 首字母大写字符串
     */
    public static String upperFirstLetter(final String str) {
        if (isEmpty(str) || !Character.isLowerCase(str.charAt(0))) return str;
        try {
            return (char) (str.charAt(0) - 32) + str.substring(1);
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "upperFirstLetter");
            return str;
        }
    }

    /**
     * 首字母小写
     * @param str 待处理字符串
     * @return 首字母小写字符串
     */
    public static String lowerFirstLetter(final String str) {
        if (isEmpty(str) || !Character.isUpperCase(str.charAt(0))) return str;
        try {
            return (char) (str.charAt(0) + 32) + str.substring(1);
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "lowerFirstLetter");
            return str;
        }
    }

    /**
     * 反转字符串
     * @param str 待处理字符串
     * @return 反转字符串
     */
    public static String reverse(final String str) {
        int len = length(str);
        if (len <= 1) return str;
        int    mid   = len >> 1;
        char[] chars = str.toCharArray();
        char   ch;
        for (int i = 0; i < mid; ++i) {
            ch                 = chars[i];
            chars[i]           = chars[len - i - 1];
            chars[len - i - 1] = ch;
        }
        return new String(chars);
    }

    /**
     * 下划线命名转为驼峰命名
     * @param str 下划线命名格式字符串
     * @return 驼峰命名格式字符串
     */
    public static String underScoreCaseToCamelCase(final String str) {
        if (isEmpty(str)) return str;
        if (!str.contains("_")) return str;
        StringBuilder builder       = new StringBuilder();
        char[]        chars         = str.toCharArray();
        boolean       hitUnderScore = false;
        builder.append(chars[0]);
        for (int i = 1, len = chars.length; i < len; i++) {
            char c = chars[i];
            if (c == '_') {
                hitUnderScore = true;
            } else {
                if (hitUnderScore) {
                    builder.append(Character.toUpperCase(c));
                    hitUnderScore = false;
                } else {
                    builder.append(c);
                }
            }
        }
        return builder.toString();
    }

    /**
     * 驼峰命名法转为下划线命名
     * @param str 驼峰命名格式字符串
     * @return 下划线命名格式字符串
     */
    public static String camelCaseToUnderScoreCase(final String str) {
        if (isEmpty(str)) return str;
        StringBuilder builder = new StringBuilder();
        char[]        chars   = str.toCharArray();
        for (char value : chars) {
            if (Character.isUpperCase(value)) {
                builder.append("_").append(Character.toLowerCase(value));
            } else {
                builder.append(value);
            }
        }
        return builder.toString();
    }

    /**
     * 字符串数据库字符转义
     * @param str 待处理字符串
     * @return 转义处理后的字符串
     */
    public static String sqliteEscape(final String str) {
        if (isEmpty(str)) return str;
        String keyWord = str;
        // 替换关键字
        keyWord = keyWord.replace("/", "//");
        keyWord = keyWord.replace("'", "''");
        keyWord = keyWord.replace("[", "/[");
        keyWord = keyWord.replace("]", "/]");
        keyWord = keyWord.replace("%", "/%");
        keyWord = keyWord.replace("&", "/&");
        keyWord = keyWord.replace("_", "/_");
        keyWord = keyWord.replace("(", "/(");
        keyWord = keyWord.replace(")", "/)");
        return keyWord;
    }

    // ============
    // = 字符串处理 =
    // ============

    /**
     * 转换手机号
     * @param phone 待处理字符串
     * @return 处理后的字符串
     */
    public static String convertHideMobile(final String phone) {
        return convertHideMobile(phone, "*");
    }

    /**
     * 转换手机号
     * @param phone  待处理字符串
     * @param symbol 转换符号
     * @return 处理后的字符串
     */
    public static String convertHideMobile(
            final String phone,
            final String symbol
    ) {
        return convertSymbolHide(3, phone, symbol);
    }

    /**
     * 转换符号处理
     * @param start  开始位置
     * @param str    待处理字符串
     * @param symbol 转换符号
     * @return 处理后的字符串
     */
    public static String convertSymbolHide(
            final int start,
            final String str,
            final String symbol
    ) {
        if (!isEmpty(str)) {
            if (start <= 0) {
                return str;
            }
            // 获取数据长度
            int length = str.length();
            // 如果数据小于 start 位则直接返回
            if (length <= start) {
                return str;
            } else { // 大于 start 位
                StringBuilder builder = new StringBuilder();
                builder.append(str.substring(0, start));
                int len = length - start;
                // 进行平分
                len /= 2;
                // 进行遍历保存
                for (int i = 0; i < len; i++) {
                    builder.append(symbol);
                }
                builder.append(str.substring(start + len, length));
                return builder.toString();
            }
        }
        return "";
    }

    // =

    /**
     * 裁剪超出的内容, 并且追加符号 ( 如 ... )
     * @param maxLength 允许最大的长度
     * @param str       待处理字符串
     * @param symbol    转换符号
     * @return 处理后的字符串
     */
    public static String subEllipsize(
            final int maxLength,
            final String str,
            final String symbol
    ) {
        if (maxLength >= 1) {
            // 获取内容长度
            int strLength = length(str);
            // 防止为不存在数据
            if (strLength != 0) {
                if (maxLength >= strLength) {
                    return str;
                }
                return str.substring(0, maxLength) + checkValue(symbol);
            }
        }
        return "";
    }

    /**
     * 裁剪符号处理
     * @param start        开始位置
     * @param symbolNumber 转换数量
     * @param str          待处理字符串
     * @param symbol       转换符号
     * @return 处理后的字符串
     */
    public static String subSymbolHide(
            final int start,
            final int symbolNumber,
            final String str,
            final String symbol
    ) {
        if (!isEmpty(str)) {
            if (start <= 0 || symbolNumber <= 0) {
                return str;
            }
            // 获取数据长度
            int length = str.length();
            // 如果数据小于 start 位则直接返回
            if (length <= start) {
                return str;
            } else { // 大于 start 位
                StringBuilder builder = new StringBuilder();
                builder.append(str.substring(0, start));
                int len = length - start - symbolNumber;
                // 如果超出总长度, 则进行控制
                if (len <= 0) { // 表示后面的全部转换
                    len = length - start;
                } else { // 需要裁剪的数量
                    len = symbolNumber;
                }
                // 进行遍历保存
                for (int i = 0; i < len; i++) {
                    builder.append(symbol);
                }
                builder.append(str.substring(start + len, length));
                return builder.toString();
            }
        }
        return "";
    }

    /**
     * 裁剪内容 ( 设置符号处理 )
     * @param str               待处理字符串
     * @param frontRetainLength 前面保留的长度
     * @param rearRetainLength  后面保留的长度
     * @param symbol            转换符号
     * @return 处理后的字符串
     */
    public static String subSetSymbol(
            final String str,
            final int frontRetainLength,
            final int rearRetainLength,
            final String symbol
    ) {
        if (str != null) {
            try {
                // 截取前面需保留的内容
                String startStr = str.substring(0, frontRetainLength);
                // 截取后面需保留的内容
                String endStr = str.substring(str.length() - rearRetainLength);
                // 特殊符号长度
                int symbolLength = str.length() - (frontRetainLength + rearRetainLength);
                if (symbolLength >= 1) {
                    StringBuilder builder = new StringBuilder();
                    for (int i = 0; i < symbolLength; i++) {
                        builder.append(symbol);
                    }
                    return startStr + builder.toString() + endStr;
                }
                return startStr + endStr;
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "subSetSymbol");
            }
        }
        return null;
    }

    // ===============
    // = 替换、截取操作 =
    // ===============

    /**
     * 裁剪字符串
     * @param str      待裁剪字符串
     * @param endIndex 结束裁剪的位置
     * @return 裁剪后的字符串
     */
    public static String substring(
            final String str,
            final int endIndex
    ) {
        return substring(str, 0, endIndex, true);
    }

    /**
     * 裁剪字符串
     * @param str      待裁剪字符串
     * @param endIndex 结束裁剪的位置
     * @param isReturn 开始位置超过限制是否返回内容
     * @return 裁剪后的字符串
     */
    public static String substring(
            final String str,
            final int endIndex,
            final boolean isReturn
    ) {
        return substring(str, 0, endIndex, isReturn);
    }

    /**
     * 裁剪字符串
     * @param str        待裁剪字符串
     * @param beginIndex 开始裁剪的位置
     * @param endIndex   结束裁剪的位置
     * @param isReturn   开始位置超过限制是否返回内容
     * @return 裁剪后的字符串
     */
    public static String substring(
            final String str,
            final int beginIndex,
            final int endIndex,
            final boolean isReturn
    ) {
        if (!isEmpty(str) && beginIndex >= 0 && endIndex >= 0 && endIndex >= beginIndex) {
            // 获取数据长度
            int len = length(str);
            // 防止超过限制
            if (beginIndex > len) {
                return isReturn ? str : "";
            }
            // 防止超过限制
            return str.substring(beginIndex, Math.min(endIndex, len));
        }
        return isReturn ? str : "";
    }

    // =

    /**
     * 替换特定字符串开头、结尾的字符串
     * 如 _____a_a_a_a_____ 传入 _ 等于 ____a_a_a_a____
     * @param str    待处理字符串
     * @param suffix 替换符号字符串
     * @return 处理后的字符串
     */
    public static String replaceSEWith(
            final String str,
            final String suffix
    ) {
        return replaceSEWith(str, suffix, "");
    }

    /**
     * 替换特定字符串开头、结尾的字符串
     * 如 _____a_a_a_a_____ 传入 _, c 等于 c____a_a_a_a____c
     * @param str     待处理字符串
     * @param suffix  替换匹配内容
     * @param replace 替换的内容
     * @return 处理后的字符串
     */
    public static String replaceSEWith(
            final String str,
            final String suffix,
            final String replace
    ) {
        try {
            if (isEmpty(str) || isEmpty(suffix) || replace == null || suffix.equals(replace)) {
                return str;
            }
            // 获取编辑内容长度
            int suffixLength = suffix.length();
            // 保存新的 Builder 中, 减少内存开销
            StringBuilder builder = new StringBuilder(str);
            // 判断是否在最头部
            if (builder.indexOf(suffix) == 0) {
                builder.delete(0, suffixLength);
                // 追加内容
                builder.insert(0, replace);
            }
            // 获取尾部的位置
            int lastIndexOf = builder.lastIndexOf(suffix);
            // 数据长度
            int bufLength = builder.length();
            // 判断是否在最尾部
            if (lastIndexOf != -1 && lastIndexOf == (bufLength - suffixLength)) {
                builder.delete(lastIndexOf, bufLength);
                // 追加内容
                builder.insert(lastIndexOf, replace);
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "replaceSEWith");
        }
        return str;
    }

    // =

    /**
     * 替换开头字符串
     * @param str    待处理字符串
     * @param prefix 开头匹配字符串
     * @return 处理后的字符串
     */
    public static String replaceStartsWith(
            final String str,
            final String prefix
    ) {
        return replaceStartsWith(str, prefix, "");
    }

    /**
     * 替换开头字符串
     * @param str         待处理字符串
     * @param prefix      开头匹配字符串
     * @param startAppend 开头追加的内容
     * @return 处理后的字符串
     */
    public static String replaceStartsWith(
            final String str,
            final String prefix,
            final String startAppend
    ) {
        if (!isEmpty(str) && !isEmpty(prefix)) {
            try {
                if (str.startsWith(prefix)) {
                    return checkValue(startAppend) + str.substring(prefix.length());
                }
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "replaceStartsWith");
            }
        }
        return str;
    }

    /**
     * 替换结尾字符串
     * @param str    待处理字符串
     * @param suffix 结尾匹配字符串
     * @return 处理后的字符串
     */
    public static String replaceEndsWith(
            final String str,
            final String suffix
    ) {
        return replaceEndsWith(str, suffix, "");
    }

    /**
     * 替换结尾字符串
     * @param str     待处理字符串
     * @param suffix  结尾匹配字符串
     * @param replace 替换的内容
     * @return 处理后的字符串
     */
    public static String replaceEndsWith(
            final String str,
            final String suffix,
            final String replace
    ) {
        if (!isEmpty(str) && !isEmpty(suffix)) {
            try {
                if (str.endsWith(suffix)) {
                    return str.substring(0, str.length() - suffix.length()) + replace;
                }
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "replaceEndsWith");
            }
        }
        return str;
    }

    // =

    /**
     * 清空特定字符串开头、结尾的字符串
     * 如 _____a_a_a_a_____ 传入 _ 等于 a_a_a_a
     * @param str    待处理字符串
     * @param suffix 匹配判断字符串
     * @return 处理后的字符串
     */
    public static String clearSEWiths(
            final String str,
            final String suffix
    ) {
        if (isEmpty(str) || isEmpty(suffix)) return str;
        try {
            // 获取编辑内容长度
            int suffixLength = suffix.length();
            // 保存新的 Builder 中, 减少内存开销
            StringBuilder builder = new StringBuilder(str);
            // 进行循环判断 ( 属于最前面的, 才进行处理 )
            while (builder.indexOf(suffix) == 0) {
                builder.delete(0, suffixLength);
            }
            // 获取尾部的位置
            int lastIndexOf = builder.lastIndexOf(suffix);
            // 数据长度
            int bufLength = builder.length();
            // 进行循环判断 ( 属于最后面的, 才进行处理 )
            while (lastIndexOf != -1 && lastIndexOf == (bufLength - suffixLength)) {
                builder.delete(lastIndexOf, bufLength);
                // 重置数据
                lastIndexOf = builder.lastIndexOf(suffix);
                bufLength   = builder.length();
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "clearSEWiths");
        }
        return str;
    }

    /**
     * 清空特定字符串开头的字符串
     * 如 _____a_a_a_a_____ 传入 _ 等于 a_a_a_a_____
     * @param str    待处理字符串
     * @param suffix 匹配判断字符串
     * @return 处理后的字符串
     */
    public static String clearStartsWith(
            final String str,
            final String suffix
    ) {
        if (isEmpty(str) || isEmpty(suffix)) return str;
        try {
            // 获取编辑内容长度
            int suffixLength = suffix.length();
            // 保存新的 Builder 中, 减少内存开销
            StringBuilder builder = new StringBuilder(str);
            // 进行循环判断 ( 属于最前面的, 才进行处理 )
            while (builder.indexOf(suffix) == 0) {
                builder.delete(0, suffixLength);
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "clearStartsWith");
        }
        return str;
    }

    /**
     * 清空特定字符串结尾的字符串
     * 如 _____a_a_a_a_____ 传入 _ 等于 _____a_a_a_a
     * @param str    待处理字符串
     * @param suffix 匹配判断字符串
     * @return 处理后的字符串
     */
    public static String clearEndsWith(
            final String str,
            final String suffix
    ) {
        if (isEmpty(str) || isEmpty(suffix)) return str;
        try {
            // 获取编辑内容长度
            int suffixLength = suffix.length();
            // 保存新的 Builder 中, 减少内存开销
            StringBuilder builder = new StringBuilder(str);
            // 获取尾部的位置
            int lastIndexOf = builder.lastIndexOf(suffix);
            // 数据长度
            int bufLength = builder.length();
            // 进行循环判断 ( 属于最后面的, 才进行处理 )
            while (lastIndexOf != -1 && lastIndexOf == (bufLength - suffixLength)) {
                builder.delete(lastIndexOf, bufLength);
                // 重置数据
                lastIndexOf = builder.lastIndexOf(suffix);
                bufLength   = builder.length();
            }
            return builder.toString();
        } catch (Exception e) {
            JCLogUtils.eTag(TAG, e, "clearEndsWith");
        }
        return str;
    }

    // =

    /**
     * 替换字符串
     * @param str     待处理字符串
     * @param suffix  匹配判断字符串
     * @param replace 替换的内容
     * @return 处理后的字符串
     */
    public static String replaceAll(
            final String str,
            final String suffix,
            final String replace
    ) {
        // 如果替换的内容或者判断的字符串为 null, 则直接跳过
        if (!isEmpty(str) && !isEmpty(suffix) && replace != null && !suffix.equals(replace)) {
            try {
                return str.replaceAll(suffix, replace);
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "replaceAll");
            }
        }
        return str;
    }

    /**
     * 替换字符串
     * @param str     待处理字符串
     * @param suffix  匹配判断字符串
     * @param replace 替换的内容
     * @return 处理后的字符串, 替换失败则返回 null
     */
    public static String replaceAllToNull(
            final String str,
            final String suffix,
            final String replace
    ) {
        // 如果替换的内容或者判断的字符串为 null, 则直接跳过
        if (!isEmpty(str) && !isEmpty(suffix) && replace != null && !suffix.equals(replace)) {
            try {
                return str.replaceAll(suffix, replace);
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "replaceAllToNull");
            }
        }
        return null;
    }

    /**
     * 替换字符串
     * @param str           待处理字符串
     * @param suffixArrays  匹配判断字符串数组
     * @param replaceArrays 准备替换的字符串数组
     * @return 处理后的字符串
     */
    public static String replaceAlls(
            final String str,
            final String[] suffixArrays,
            final String[] replaceArrays
    ) {
        // 防止数据为 null
        if (str != null && suffixArrays != null && replaceArrays != null) {
            String tempString = str;
            // 替换的特殊字符串长度
            int spCount = suffixArrays.length;
            // 替换的内容长度
            int reCount = replaceArrays.length;
            // 相同才进行处理
            if (spCount == reCount) {
                // 遍历进行判断
                for (int i = 0; i < spCount; i++) {
                    // 进行替换字符串
                    tempString = replaceAll(tempString, suffixArrays[i], replaceArrays[i]);
                }
                return tempString;
            }
        }
        return null;
    }

    /**
     * 拆分字符串
     * @param str   待处理字符串
     * @param regex 正则表达式
     * @return 拆分后的数组
     */
    public static String[] split(
            final String str,
            final String regex
    ) {
        if (!StringUtils.isEmpty(str) && !StringUtils.isEmpty(regex)) {
            return str.split(regex);
        }
        return null;
    }

    /**
     * 拆分字符串获取指定索引
     * @param str   待处理字符串
     * @param regex 正则表达式
     * @param index 索引
     * @return 拆分后的数组
     */
    public static String split(
            final String str,
            final String regex,
            final int index
    ) {
        return split(str, regex, index, null);
    }

    /**
     * 拆分字符串获取指定索引
     * @param str        待处理字符串
     * @param regex      正则表达式
     * @param index      索引
     * @param defaultStr 默认字符串
     * @return 拆分后的数组
     */
    public static String split(
            final String str,
            final String regex,
            final int index,
            final String defaultStr
    ) {
        if (index >= 0) {
            String[] arrays = split(str, regex);
            if (arrays != null && arrays.length > index) {
                return arrays[index];
            }
        }
        return defaultStr;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy