一个Java中有用的StringUtil类

一、Java中StringUtil工具

在Java开发中,字符串处理是一项非常常见且必不可少的任务。为了方便进行字符串的操作和处理,通常会使用一些工具类来提供各种功能。本文将提供一个基于String的StringUtil的工具类,它继承自Spring的StringUtils类,并提供了一系列实用的方法来处理字符串。

二、Java中字符串处理要求的一般方法

在Java中,字符串处理通常包括以下一些常见的操作:

  1. 字符串的拼接、分割和替换。
  2. 字符串的格式化,例如按照特定的模板进行格式化。
  3. 字符串的空白处理,判断字符串是否为空或只包含空白字符。
  4. 字符串的查找和匹配,包括判断字符串是否包含特定的子串或是否符合特定的模式。
  5. 字符串的大小写转换。
  6. 字符串的截取和提取。

三、主要内容

StringUtil工具类提供了许多方法来满足上述字符串处理的需求。它包含了一些判断字符串是否为空、是否为数字、是否包含特定字符等的方法。此外,还提供了字符串的格式化、分割、拼接、随机生成、转义HTML、清理字符等功能。

四、包含的全部方法(53项)

  1. isBlank方法:用于检查给定的CharSequence是否只包含空白字符。
  2. isNotBlank方法:检查CharSequence是否不为空、不为null且不包含只空白字符。
  3. isAnyBlank方法:判断多个CharSequence中是否有任意一个为空白。
  4. isNoneBlank方法:判断多个CharSequence是否全不为空白。
  5. isAllBlank方法:判断多个CharSequence是否全为空白。
  6. isNumeric方法:判断字符串是否为数字。
  7. format方法:有两个重载形式,一个用于将字符串中特定模式的字符转换成map中对应的值,另一个用于按照log格式的规则进行格式化。
  8. join方法:用于将CollectionString数组转换为以逗号或指定分隔符分隔的字符串。
  9. simpleMatch方法:判断字符串是否符合指定的表达式模式。
  10. randomUUID方法:生成UUID。
  11. escapeHtml方法:转义HTML用于安全过滤。
  12. cleanChars方法:清理字符串,去除某些不可见字符。
  13. cleanText方法:清理字符串,去除某些不可见字符和一些SQL特殊字符。
  14. cleanIdentifier方法:获取标识符,用于参数清理。
  15. random方法:生成指定长度和类型的随机数。
  16. indexedFormat方法:有序地格式化文本,使用{number}做为占位符。
  17. format方法:使用{varName}占位符格式化文本。
  18. split方法:切分字符串,可选择是否去除切分后每个元素两边的空白符、是否去除空白项以及限制分片数。
  19. splitTrim方法:与split方法类似,但会去除切分后每个元素两边的空白符和空白项。
  20. contains方法:判断指定字符是否在字符串中出现过。
  21. containsAny方法:查找指定字符串是否包含指定字符串列表中的任意一个字符串。
  22. getContainsStr方法:查找指定字符串是否包含指定字符串列表中的任意一个字符串,如果包含返回找到的第一个字符串。
  23. containsIgnoreCase方法:判断是否包含特定字符,忽略大小写。
  24. containsAnyIgnoreCase方法:查找指定字符串是否包含指定字符串列表中的任意一个字符串,忽略大小写。
  25. getContainsStrIgnoreCase方法:查找指定字符串是否包含指定字符串列表中的任意一个字符串,如果包含返回找到的第一个字符串,忽略大小写。
  26. sub方法:改进JDK的subString方法,对索引进行了修正。
  27. subBefore方法:截取分隔字符串之前的字符串,不包括分隔字符串。
  28. subAfter方法:截取分隔字符串之后的字符串,不包括分隔字符串。
  29. subBetween方法:截取指定字符串中间部分,不包括标识字符串。
  30. removePrefix方法:去掉指定前缀。
  31. removePrefixIgnoreCase方法:忽略大小写去掉指定前缀。
  32. removeSuffix方法:去掉指定后缀。
  33. removeSufAndLowerFirst方法:去掉指定后缀,并小写首字母。
  34. removeSuffixIgnoreCase方法:忽略大小写去掉指定后缀。
  35. firstCharToLower方法:首字母变小写。
  36. firstCharToUpper方法:首字母变大写。
  37. subPre方法:切割指定位置之前部分的字符串。
  38. subSuf方法:切割指定位置之后部分的字符串。
  39. indexOf方法:指定范围内查找指定字符。
  40. indexOfIgnoreCase方法:指定范围内查找字符串,忽略大小写。
  41. lastIndexOfIgnoreCase方法:指定范围内反向查找字符串,忽略大小写。
  42. ordinalIndexOf方法:返回字符串在另一个字符串中第ordinal次出现的位置。
  43. isSubEquals方法:判断两个字符串的子串是否相同,可选择是否忽略大小写。
  44. equals方法:比较两个字符串是否相等,可选择是否忽略大小写。
  45. builder方法:创建StringBuilder对象,可选择指定初始大小或初始字符串列表。
  46. appendBuilder方法:向StringBuilder对象中追加字符串。
  47. getReader方法:获得StringReader
  48. getWriter方法:获得StringWriter
  49. count方法:统计指定内容中包含指定字符串或字符的数量。
  50. underlineToHump方法:下划线转驼峰。
  51. humpToUnderline方法:驼峰转下划线。
  52. lineToHump方法:横线转驼峰。
  53. humpToLine方法:驼峰转横线。

五、总结

本文StringUtil工具类提供了丰富的方法来处理字符串,涵盖了字符串的各种常见操作。通过使用这些方法,可以方便地进行字符串的判断、格式化、分割、拼接、查找等操作,提高了开发效率。在实际开发中,可以根据具体的需求选择合适的方法来处理字符串,使代码更加简洁和可读。同时,需要注意方法的参数和返回值,以确保正确使用这些方法。希望这个工具类能够对Java开发者在字符串处理方面提供帮助。

六、源码

附上工具类源码:


import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.util.HtmlUtils;

import java.io.StringReader;
import java.io.StringWriter;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Pattern;
import java.util.stream.Stream;

/**
 * 继承自Spring util的工具类,封装String常用操作
 *
 * @author Rzc
 */
public class StringUtil extends org.springframework.util.StringUtils {
   
   

	public static final int INDEX_NOT_FOUND = -1;

	/**
	 * Check whether the given {@code CharSequence} contains actual <em>text</em>.
	 * <p>More specifically, this method returns {@code true} if the
	 * {@code CharSequence} is not {@code null}, its length is greater than
	 * 0, and it contains at least one non-whitespace character.
	 * <pre class="code">
	 * StringUtil.isBlank(null) = true
	 * StringUtil.isBlank("") = true
	 * StringUtil.isBlank(" ") = true
	 * StringUtil.isBlank("12345") = false
	 * StringUtil.isBlank(" 12345 ") = false
	 * </pre>
	 *
	 * @param cs the {@code CharSequence} to check (may be {@code null})
	 * @return {@code true} if the {@code CharSequence} is not {@code null},
	 * its length is greater than 0, and it does not contain whitespace only
	 * @see Character#isWhitespace
	 */
	public static boolean isBlank(final CharSequence cs) {
   
   
		return !StringUtil.hasText(cs);
	}

	/**
	 * <p>Checks if a CharSequence is not empty (""), not null and not whitespace only.</p>
	 * <pre>
	 * StringUtil.isNotBlank(null)	  = false
	 * StringUtil.isNotBlank("")		= false
	 * StringUtil.isNotBlank(" ")	   = false
	 * StringUtil.isNotBlank("bob")	 = true
	 * StringUtil.isNotBlank("  bob  ") = true
	 * </pre>
	 *
	 * @param cs the CharSequence to check, may be null
	 * @return {@code true} if the CharSequence is
	 * not empty and not null and not whitespace
	 * @see Character#isWhitespace
	 */
	public static boolean isNotBlank(final CharSequence cs) {
   
   
		return StringUtil.hasText(cs);
	}

	/**
	 * 有 任意 一个 Blank
	 *
	 * @param css CharSequence
	 * @return boolean
	 */
	public static boolean isAnyBlank(final CharSequence... css) {
   
   
		if (ObjectUtil.isEmpty(css)) {
   
   
			return true;
		}
		return Stream.of(css).anyMatch(StringUtil::isBlank);
	}

	/**
	 * 是否全非 Blank
	 *
	 * @param css CharSequence
	 * @return boolean
	 */
	public static boolean isNoneBlank(final CharSequence... css) {
   
   
		if (ObjectUtil.isEmpty(css)) {
   
   
			return false;
		}
		return Stream.of(css).allMatch(StringUtil::isNotBlank);
	}

	/**
	 * 是否全为 Blank
	 *
	 * @param css CharSequence
	 * @return boolean
	 */
	public static boolean isAllBlank(final CharSequence... css) {
   
   
		return Stream.of(css).allMatch(StringUtil::isBlank);
	}

	/**
	 * 判断一个字符串是否是数字
	 *
	 * @param cs the CharSequence to check, may be null
	 * @return {boolean}
	 */
	public static boolean isNumeric(final CharSequence cs) {
   
   
		if (isBlank(cs)) {
   
   
			return false;
		}
		for (int i = cs.length(); --i >= 0; ) {
   
   
			int chr = cs.charAt(i);
			if (chr < 48 || chr > 57) {
   
   
				return false;
			}
		}
		return true;
	}

	/**
	 * 将字符串中特定模式的字符转换成map中对应的值
	 * <p>
	 * use: format("my name is ${name}, and i like ${like}!", {"name":"s.l.m", "like": "Java"})
	 *
	 * @param message 需要转换的字符串
	 * @param params  转换所需的键值对集合
	 * @return 转换后的字符串
	 */
	public static String format(@Nullable String message, @Nullable Map<String, ?> params) {
   
   
		// message 为 null 返回空字符串
		if (message == null) {
   
   
			return StringPool.EMPTY;
		}
		// 参数为 null 或者为空
		if (params == null || params.isEmpty()) {
   
   
			return message;
		}
		// 替换变量
		StringBuilder sb = new StringBuilder((int) (message.length() * 1.5));
		int cursor = 0;
		for (int start, end; (start = message.indexOf(StringPool.DOLLAR_LEFT_BRACE, cursor)) != -1 && (end = message.indexOf(StringPool.RIGHT_BRACE, start)) != -1; ) {
   
   
			sb.append(message, cursor, start);
			String key = message.substring(start + 2, end);
			Object value = params.get(StringUtil.trimWhitespace(key));
			sb.append(value == null ? StringPool.EMPTY : value);
			cursor = end + 1;
		}
		sb.append(message.substring(cursor));
		return sb.toString();
	}

	/**
	 * 同 log 格式的 format 规则
	 * <p>
	 * use: format("my name is {}, and i like {}!", "s.l.m", "Java")
	 *
	 * @param message   需要转换的字符串
	 * @param arguments 需要替换的变量
	 * @return 转换后的字符串
	 */
	public static String format(@Nullable String message, @Nullable Object... arguments) {
   
   
		// message 为 null 返回空字符串
		if (message == null) {
   
   
			return StringPool.EMPTY;
		}
		// 参数为 null 或者为空
		if (arguments == null || arguments.length == 0) {
   
   
			return message;
		}
		StringBuilder sb = new StringBuilder((int) (message.length() * 1.5));
		int cursor = 0;
		int index = 0;
		int argsLength = arguments.length;
		for (int start, end; (start = message.indexOf('{', cursor)) != -1 && (end = message.indexOf('}', start)) != -1 && index < argsLength; ) {
   
   
			sb.append(message, cursor, start);
			sb.append(arguments[index]);
			cursor = end + 1;
			index++;
		}
		sb.append(message.substring(cursor));
		return sb.toString();
	}

	/**
	 * 格式化执行时间,单位为 ms 和 s,保留三位小数
	 *
	 * @param nanos 纳秒
	 * @return 格式化后的时间
	 */
	public static String format(long nanos) {
   
   
		if (nanos < 1) {
   
   
			return "0ms";
		}
		double millis = (double) nanos / (1000 * 1000);
		// 不够 1 ms,最小单位为 ms
		if (millis > 1000) {
   
   
			return String.format("%.3fs", millis / 1000);
		} else {
   
   
			return String.format("%.3fms", millis);
		}
	}

	/**
	 * Convert a {@code Collection} into a delimited {@code String} (e.g., CSV).
	 * <p>Useful for {@code toString()} implementations.
	 *
	 * @param coll the {@code Collection} to convert
	 * @return the delimited {@code String}
	 */
	public static String join(Collection<?> coll) {
   
   
		return StringUtil.collectionToCommaDelimitedString(coll);
	}

	/**
	 * Convert a {@code Collection} into a delimited {@code String} (e.g. CSV).
	 * <p>Useful for {@code toString()} implementations.
	 *
	 * @param coll  the {@code Collection} to convert
	 * @param delim the delimiter to use (typically a ",")
	 * @return the delimited {@code String}
	 */
	public static String join(Collection<?> coll, String delim) {
   
   
		return StringUtil.collectionToDelimitedString(coll, delim);
	}

	/**
	 * Convert a {@code Str
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷丩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值