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

org.chobit.commons.utils.StrKit Maven / Gradle / Ivy

The newest version!
package org.chobit.commons.utils;

import java.text.DecimalFormat;
import java.util.Objects;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.chobit.commons.constans.Symbol.COMMA;
import static org.chobit.commons.constans.Symbol.DASHED;

/**
 * 字符串工具类
 *
 * @author robin
 */
public final class StrKit {

    /**
     * 判断字符串为空
     *
     * @param str 目标字符串
     * @return 字符串是否为空
     */
    public static boolean isBlank(final String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if ((!Character.isWhitespace(str.charAt(i)))) {
                return false;
            }
        }
        return true;
    }


    /**
     * 判断字符串不为空
     *
     * @param str 目标字符串
     * @return 字符串是否不为空
     */
    public static boolean isNotBlank(final String str) {
        return !isBlank(str);
    }


    /**
     * 当目标值为空时,取另一个值,用于简化三目运算
     *
     * @param value 目标值
     * @param other 替代值
     * @return 字符串
     */
    public static String blankOr(final String value, final String other) {
        return isBlank(value) ? other : value;
    }


    /**
     * 生成uuid
     *
     * @return uuid
     */
    public static String uuid() {
        return UUID.randomUUID().toString().replaceAll(DASHED, "");
    }


    /**
     * 整型判断正则表达式
     */
    private static final Pattern PATTERN_INTEGER = Pattern.compile("^[-+]?[\\d]*$");

    /**
     * 判断字符串是否是整数字符串
     *
     * @param str 字符串
     * @return 是否是整数字符串
     */
    public static boolean isInteger(final String str) {
        if (isBlank(str)) {
            return false;
        }
        return PATTERN_INTEGER.matcher(str.trim()).matches();
    }

    /**
     * 浮点型判断正则表达式
     */
    private static final Pattern PATTERN_DOUBLE = Pattern.compile("^[-+]?\\d+(\\.\\d+)?$");

    /**
     * 判断字符串是否是浮点数字符串
     *
     * @param str 字符串
     * @return 是否是整数字符串
     */
    public static boolean isDouble(final String str) {
        if (isBlank(str)) {
            return false;
        }
        return PATTERN_DOUBLE.matcher(str.trim()).matches();
    }

    /**
     * 判断字符串是否是数字
     *
     * @param str 字符串
     * @return 是否是整数字符串
     */
    public static boolean isNumeric(final String str) {
        if (str != null && !str.isEmpty()) {
            int l = str.length();
            for (int i = 0; i < l; ++i) {
                if (!Character.isDigit(str.codePointAt(i))) {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断字符串是否是布尔型字符串
     *
     * @param str 字符串
     * @return 是否是布尔型字符串
     */
    public static boolean isBool(final String str) {
        if (isBlank(str)) {
            return false;
        }
        String s = str.toLowerCase().trim();
        return "true".equals(s) || "false".equals(s);
    }


    /**
     * 将对象转字符串
     *
     * @param src 原始对象
     * @param  原始对象类型
     * @return 原始对象对应的字符串
     */
    public static  String toStr(final T src) {
        if (null == src) {
            return "";
        }
        return String.valueOf(src);
    }


    /**
     * 格式化数字
     *
     * @param pattern 格式
     * @param value   数值
     * @return 格式化后的数字
     */
    public static String format(final String pattern, final double value) {
        return new DecimalFormat(pattern).format(value);
    }


    /**
     * 大写字母表达式
     */
    private static final Pattern PATTERN_UPPER = Pattern.compile("[A-Z]");

    /**
     * 驼峰格式转下划线
     *
     * @param str 原始字符串
     * @return 驼峰转下划线后的字符串
     */
    public static String humpToLine(final String str) {
        Matcher matcher = PATTERN_UPPER.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }


    /**
     * 驼峰格式转下划线
     *
     * @param str 原始字符串
     * @return 驼峰转下划线后的字符串
     */
    public static String humpToLine2(final String str) {
        return str.replaceAll("[A-Z]", "_$0").toLowerCase();
    }


    /**
     * 下划线+字符 表达式
     */
    private static final Pattern PATTERN_LINE = Pattern.compile("_(\\w)");

    /**
     * 下划线转驼峰
     *
     * @param src 原始字符串
     * @return 下划线转驼峰后的字符串
     */
    public static String lineToHump(String src) {
        Objects.requireNonNull(src);

        src = src.toLowerCase();
        Matcher matcher = PATTERN_LINE.matcher(src);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }


    /**
     * 根据正则表达式从字符串中提取数据
     *
     * @param source 源字符串
     * @param regex  正则表达式
     * @return 符合正则表达式的字符串
     */
    public static String takeSubWithRegex(final String source, final String regex) {
        Pattern pattern = Pattern.compile(regex);
        return takeSubWithPattern(source, pattern);
    }


    /**
     * 根据正则表达式从字符串中提取数据
     *
     * @param source  源字符串
     * @param pattern Pattern实例
     * @return 符合正则表达式的字符串
     */
    public static String takeSubWithPattern(final String source, final Pattern pattern) {
        Matcher matcher = pattern.matcher(source);
        return takeFromMatcher(matcher);
    }


    /**
     * 基于Matcher提取数据
     *
     * @param matcher Matcher实例
     * @return Matcher实例匹配到的数据
     */
    public static String takeFromMatcher(final Matcher matcher) {
        if (matcher.find()) {
            return matcher.group();
        }
        return null;
    }


    /**
     * 执行异或运算
     *
     * @param str 原始字符串
     * @param key key
     * @return 异或运算结果
     */
    public static byte[] xor(final String str, final String key) {
        if (isBlank(str) || isBlank(key)) {
            return new byte[]{};
        }

        char[] infoChar = str.toCharArray();
        char[] keyChar = key.toCharArray();
        byte[] result = new byte[infoChar.length];
        for (int i = 0; i < infoChar.length; i++) {
            result[i] = (byte) ((infoChar[i] ^ keyChar[i % keyChar.length]) & 0xFF);
        }

        return result;
    }


    /**
     * 从多个字符串中依序取第一个不为空的值
     *
     * @param args 字符串参数
     * @return 第一个不为空的值
     */
    public static String coalesce(final String... args) {
        for (String s : args) {
            if (isNotBlank(s)) {
                return s;
            }
        }
        return null;
    }


    /**
     * 拼接字符串
     *
     * @param separator 分隔符
     * @param elements  要拼接的元素
     * @return 字符串
     */
    public static String join(final String separator, final Object... elements) {
        StringBuilder builder = new StringBuilder();
        for (Object ele : elements) {
            if (builder.length() > 0) {
                builder.append(separator);
            }
            builder.append(ele);
        }
        return builder.toString();
    }


    /**
     * 以逗号做分隔符拼接字符串
     *
     * @param elements 要拼接的元素
     * @return 字符串
     */
    public static String join(final Object... elements) {
        return join(COMMA, elements);
    }


    /**
     * 字符串切分
     *
     * @param src       原始字符串
     * @param separator 分隔符
     * @return 字符串切分结果
     */
    public static String[] split(final String src, final String separator) {
        if (isBlank(src)) {
            return new String[]{};
        }
        return src.split(separator);
    }


    /**
     * 以逗号做分隔符切分字符串
     *
     * @param src 原始字符串
     * @return 字符串切分结果
     */
    public static String[] split(final String src) {
        return split(src, COMMA);
    }


    private StrKit() {
        throw new UnsupportedOperationException("Private constructor, cannot be accessed.");
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy