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

com.jchanghong.core.kotlin.StrHelper.kt Maven / Gradle / Ivy

The newest version!
package com.jchanghong.core.kotlin

import cn.hutool.core.util.StrUtil
import java.io.StringReader
import java.nio.ByteBuffer
import java.nio.charset.Charset

fun main() {
    println("sa".toCamelCase())
}
//fun\s+(\w+)(\(str: CharSequence\?,*)([^{]+)
/**
 * 字符串工具类
 *
 * @author xiaoleilu
 */
/**
 * 字符串是否为空白 空白的定义如下: 

* 1、为null

* 2、为不可见字符(如空格)

* 3、""

* * @param str 被检测的字符串 * @return 是否为空 */ fun CharSequence?.isBlank(): Boolean { return StrUtil.isBlank(this) } /** * 字符串是否为非空白,非空白的定义如下:

* 1、不为null

* 2、不为不可见字符(如空格)

* 3、不为""

* * @param str 被检测的字符串 * @return 是否为非空 */ fun CharSequence?.isNotBlank(): Boolean { return StrUtil.isNotBlank(this) } /** * 是否包含空字符串 * * @param strs 字符串列表 * @return 是否包含空字符串 */ fun Collection.hasBlank(): Boolean { return StrUtil.hasBlank(*this.toTypedArray()) } /** * 给定所有字符串是否为空白 * * @param strs 字符串 * @return 所有字符串是否为空白 */ fun Collection.isAllBlank(): Boolean { return StrUtil.isAllBlank(*this.toTypedArray()) } /** * 字符串是否为空,空的定义如下:

* 1、为null

* 2、为""

* * @param str 被检测的字符串 * @return 是否为空 */ fun CharSequence?.isEmpty(): Boolean { return StrUtil.isEmpty(this) } /** * 字符串是否为非空白,非空白的定义如下:

* 1、不为null

* 2、不为""

* * @param str 被检测的字符串 * @return 是否为非空 */ fun CharSequence?.isNotEmpty(): Boolean { return StrUtil.isNotEmpty(this) } /** * 当给定字符串为null时,转换为Empty * * @param str 被检查的字符串 * @return 原字符串或者空串 * @see .nullToEmpty * @since 4.6.3 */ fun CharSequence?.emptyIfNull(): String { return StrUtil.emptyIfNull(this) } /** * 当给定字符串为null时,转换为Empty * * @param str 被转换的字符串 * @return 转换后的字符串 */ fun CharSequence?.nullToEmpty(): String { return StrUtil.nullToEmpty(this) } /** * 如果字符串是`null`,则返回指定默认字符串,否则返回字符串本身。 * *
 * nullToDefault(null, "default")  = "default"
 * nullToDefault("", "default")    = ""
 * nullToDefault("  ", "default")  = "  "
 * nullToDefault("bat", "default") = "bat"
* * * @param str 要转换的字符串 * @param defaultStr 默认字符串 * @return 字符串本身或指定的默认字符串 */ fun CharSequence?.nullToDefault(defaultStr: String): String { return StrUtil.nullToDefault(this, defaultStr) } /** * 如果字符串是`null`或者"",则返回指定默认字符串,否则返回字符串本身。 * *
 * emptyToDefault(null, "default")  = "default"
 * emptyToDefault("", "default")    = "default"
 * emptyToDefault("  ", "default")  = "  "
 * emptyToDefault("bat", "default") = "bat"
* * * @param str 要转换的字符串 * @param defaultStr 默认字符串 * @return 字符串本身或指定的默认字符串 * @since 4.1.0 */ fun CharSequence?.emptyToDefault(defaultStr: String): String { return StrUtil.emptyToDefault(this, defaultStr) } /** * 如果字符串是`null`或者""或者空白,则返回指定默认字符串,否则返回字符串本身。 * *
 * emptyToDefault(null, "default")  = "default"
 * emptyToDefault("", "default")    = "default"
 * emptyToDefault("  ", "default")  = "default"
 * emptyToDefault("bat", "default") = "bat"
* * * @param str 要转换的字符串 * @param defaultStr 默认字符串 * @return 字符串本身或指定的默认字符串 * @since 4.1.0 */ fun CharSequence?.blankToDefault(defaultStr: String): String { return StrUtil.blankToDefault(this, defaultStr) } /** * 当给定字符串为空字符串时,转换为`null` * * @param str 被转换的字符串 * @return 转换后的字符串 */ fun CharSequence?.emptyToNull(): String { return StrUtil.emptyToNull(this) } /** * 是否包含空字符串 * * @param strs 字符串列表 * @return 是否包含空字符串 */ fun Collection.hasEmpty(): Boolean { return StrUtil.hasEmpty(*this.toTypedArray()) } /** * 是否全部为空字符串 * * @param strs 字符串列表 * @return 是否全部为空字符串 */ fun Collection.isAllEmpty(): Boolean { return StrUtil.isAllEmpty(*this.toTypedArray()) } /** * 检查字符串是否为null、“null”、“undefined” * * @param str 被检查的字符串 * @return 是否为null、“null”、“undefined” * @since 4.0.10 */ fun CharSequence?.isNullOrUndefined(): Boolean { return StrUtil.isNullOrUndefined(this) } /** * 检查字符串是否为null、“”、“null”、“undefined” * * @param str 被检查的字符串 * @return 是否为null、“”、“null”、“undefined” * @since 4.0.10 */ fun CharSequence?.isEmptyOrUndefined(): Boolean { return StrUtil.isEmptyOrUndefined(this) } /** * 检查字符串是否为null、空白串、“null”、“undefined” * * @param str 被检查的字符串 * @return 是否为null、空白串、“null”、“undefined” * @since 4.0.10 */ fun CharSequence?.isBlankOrUndefined(): Boolean { return StrUtil.isBlankOrUndefined(this) } /** * 除去字符串头尾部的空白,如果字符串是`null`,依然返回`null`。 * * * * 注意,和`String.trim`不同,此方法使用`NumberUtil.isBlankChar` 来判定空白, 因而可以除去英文字符集之外的其它空白,如中文空格。 * *
 * trim(null)          = null
 * trim("")            = ""
 * trim("     ")       = ""
 * trim("abc")         = "abc"
 * trim("    abc    ") = "abc"
* * * @param str 要处理的字符串 * @return 除去头尾空白的字符串,如果原字串为`null`,则返回`null` */ fun CharSequence?.trim(): String { return StrUtil.trim(this.toString()) } /** * 给定字符串数组全部做去首尾空格 * * @param strs 字符串数组 */ fun Collection.trim(): List { return this.map { it.trim() } } /** * 除去字符串头部的空白,如果字符串是`null`,则返回`null`。 * * * * 注意,和`String.trim`不同,此方法使用`CharUtil.isBlankChar` 来判定空白, 因而可以除去英文字符集之外的其它空白,如中文空格。 * *
 * trimStart(null)         = null
 * trimStart("")           = ""
 * trimStart("abc")        = "abc"
 * trimStart("  abc")      = "abc"
 * trimStart("abc  ")      = "abc  "
 * trimStart(" abc ")      = "abc "
* * * @param str 要处理的字符串 * @return 除去空白的字符串,如果原字串为`null`或结果字符串为`""`,则返回 `null` */ fun CharSequence?.trimStart(): String { return StrUtil.trimStart(this.toString()) } /** * 除去字符串尾部的空白,如果字符串是`null`,则返回`null`。 * * * * 注意,和`String.trim`不同,此方法使用`CharUtil.isBlankChar` 来判定空白, 因而可以除去英文字符集之外的其它空白,如中文空格。 * *
 * trimEnd(null)       = null
 * trimEnd("")         = ""
 * trimEnd("abc")      = "abc"
 * trimEnd("  abc")    = "  abc"
 * trimEnd("abc  ")    = "abc"
 * trimEnd(" abc ")    = " abc"
* * * @param str 要处理的字符串 * @return 除去空白的字符串,如果原字串为`null`或结果字符串为`""`,则返回 `null` */ fun CharSequence?.trimEnd(): String { return StrUtil.trimEnd(this.toString()) } /** * 除去字符串头尾部的空白符,如果字符串是`null`,依然返回`null`。 * * @param str 要处理的字符串 * @param mode `-1`表示trimStart,`0`表示trim全部, `1`表示trimEnd * @return 除去指定字符后的的字符串,如果原字串为`null`,则返回`null` */ fun CharSequence?.trim(mode: Int): String { return StrUtil.trim(this.toString(), mode) } /** * 字符串是否以给定字符开始 * * @param str 字符串 * @param c 字符 * @return 是否开始 */ fun CharSequence?.startWith(c: Char): Boolean { return StrUtil.startWith(this ?: "", c) } /** * 是否以指定字符串开头

* 如果给定的字符串和开头字符串都为null则返回true,否则任意一个值为null返回false * * @param str 被监测字符串 * @param prefix 开头字符串 * @param isIgnoreCase 是否忽略大小写 * @return 是否以指定字符串开头 */ fun CharSequence?.startWith(prefix: CharSequence?, isIgnoreCase: Boolean): Boolean { return StrUtil.startWith(this ?: "", prefix ?: "", isIgnoreCase) } /** * 是否以指定字符串开头 * * @param str 被监测字符串 * @param prefix 开头字符串 * @return 是否以指定字符串开头 */ fun CharSequence?.startWith(prefix: CharSequence?): Boolean { return StrUtil.startWith(this ?: "", prefix ?: "") } /** * 是否以指定字符串开头,忽略大小写 * * @param str 被监测字符串 * @param prefix 开头字符串 * @return 是否以指定字符串开头 */ fun CharSequence?.startWithIgnoreCase(prefix: CharSequence?): Boolean { return StrUtil.startWithIgnoreCase(this ?: "", prefix ?: "") } /** * 给定字符串是否以任何一个字符串开始

* 给定字符串和数组为空都返回false * * @param str 给定字符串 * @param prefixes 需要检测的开始字符串 * @return 给定字符串是否以任何一个字符串开始 * @since 3.0.6 */ fun CharSequence?.startWithAny(vararg prefixes: CharSequence?): Boolean { return StrUtil.startWithAny(this ?: "", *prefixes) } /** * 字符串是否以给定字符结尾 * * @param str 字符串 * @param c 字符 * @return 是否结尾 */ fun CharSequence?.endWith(c: Char): Boolean { return StrUtil.endWith(this ?: "", c) } /** * 是否以指定字符串结尾

* 如果给定的字符串和开头字符串都为null则返回true,否则任意一个值为null返回false * * @param str 被监测字符串 * @param suffix 结尾字符串 * @param isIgnoreCase 是否忽略大小写 * @return 是否以指定字符串结尾 */ fun CharSequence?.endWith(suffix: CharSequence?, isIgnoreCase: Boolean): Boolean { return StrUtil.endWith(this ?: "", suffix ?: "", isIgnoreCase) } /** * 是否以指定字符串结尾 * * @param str 被监测字符串 * @param suffix 结尾字符串 * @return 是否以指定字符串结尾 */ fun CharSequence?.endWith(suffix: CharSequence?): Boolean { return StrUtil.endWith(this ?: "", suffix ?: "") } /** * 是否以指定字符串结尾,忽略大小写 * * @param str 被监测字符串 * @param suffix 结尾字符串 * @return 是否以指定字符串结尾 */ fun CharSequence?.endWithIgnoreCase(suffix: CharSequence?): Boolean { return StrUtil.endWithIgnoreCase(this ?: "", suffix ?: "") } /** * 给定字符串是否以任何一个字符串结尾

* 给定字符串和数组为空都返回false * * @param str 给定字符串 * @param suffixes 需要检测的结尾字符串 * @return 给定字符串是否以任何一个字符串结尾 * @since 3.0.6 */ fun CharSequence?.endWithAny(vararg suffixes: CharSequence?): Boolean { return StrUtil.endWithAny(this ?: "", *suffixes) } /** * 指定字符是否在字符串中出现过 * * @param str 字符串 * @param searchChar 被查找的字符 * @return 是否包含 * @since 3.1.2 */ fun CharSequence?.contains(searchChar: Char): Boolean { return StrUtil.contains(this ?: "", searchChar) } /** * 指定字符串是否在字符串中出现过 * * @param str 字符串 * @param searchStr 被查找的字符串 * @return 是否包含 * @since 5.1.1 */ fun CharSequence?.contains(searchStr: CharSequence?): Boolean { return StrUtil.contains(this ?: "", searchStr ?: "") } /** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串 * * @param str 指定字符串 * @param testStrs 需要检查的字符串数组 * @return 是否包含任意一个字符串 * @since 3.2.0 */ fun CharSequence?.containsAny(vararg testStrs: CharSequence?): Boolean { return StrUtil.containsAny(this ?: "", *testStrs) } /** * 查找指定字符串是否包含指定字符列表中的任意一个字符 * * @param str 指定字符串 * @param testChars 需要检查的字符数组 * @return 是否包含任意一个字符 * @since 4.1.11 */ fun CharSequence?.containsAny(vararg testChars: Char): Boolean { return StrUtil.containsAny(this ?: "", *testChars) } /** * 检查指定字符串中是否只包含给定的字符 * * @param str 字符串 * @param testChars 检查的字符 * @return 字符串含有非检查的字符,返回false * @since 4.4.1 */ fun CharSequence?.containsOnly(vararg testChars: Char): Boolean { return StrUtil.containsOnly(this ?: "", *testChars) } /** * 给定字符串是否包含空白符(空白符包括空格、制表符、全角空格和不间断空格)

* 如果给定字符串为null或者"",则返回false * * @param str 字符串 * @return 是否包含空白符 * @since 4.0.8 */ fun CharSequence?.containsBlank(): Boolean { return StrUtil.containsBlank(this.toString()) } /** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串,如果包含返回找到的第一个字符串 * * @param str 指定字符串 * @param testStrs 需要检查的字符串数组 * @return 被包含的第一个字符串 * @since 3.2.0 */ fun CharSequence?.getContainsStr(vararg testStrs: CharSequence?): String { return StrUtil.getContainsStr(this ?: "", *testStrs) } /** * 是否包含特定字符,忽略大小写,如果给定两个参数都为`null`,返回true * * @param str 被检测字符串 * @param testStr 被测试是否包含的字符串 * @return 是否包含 */ fun CharSequence?.containsIgnoreCase(testStr: CharSequence?): Boolean { return StrUtil.containsIgnoreCase(this.toString(), testStr.toString()) } /** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串

* 忽略大小写 * * @param str 指定字符串 * @param testStrs 需要检查的字符串数组 * @return 是否包含任意一个字符串 * @since 3.2.0 */ fun CharSequence?.containsAnyIgnoreCase(vararg testStrs: CharSequence?): Boolean { return StrUtil.containsAnyIgnoreCase(this ?: "", *testStrs) } /** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串,如果包含返回找到的第一个字符串

* 忽略大小写 * * @param str 指定字符串 * @param testStrs 需要检查的字符串数组 * @return 被包含的第一个字符串 * @since 3.2.0 */ fun CharSequence?.getContainsStrIgnoreCase(vararg testStrs: CharSequence?): String { return StrUtil.getContainsStrIgnoreCase(this ?: "", *testStrs) } /** * 获得set或get或is方法对应的标准属性名

* 例如:setName 返回 name * *
 * getName =》name
 * setName =》name
 * isName  =》name
* * * @param getOrSetMethodName Get或Set方法名 * @return 如果是set或get方法名,返回field, 否则null */ fun CharSequence.getGeneralField(): String { return StrUtil.getGeneralField(this) ?: "" } /** * 生成set方法名

* 例如:name 返回 setName * * @param fieldName 属性名 * @return setXxx */ fun CharSequence.genSetter(): String { return StrUtil.genSetter(this) } /** * 生成get方法名 * * @param fieldName 属性名 * @return getXxx */ fun CharSequence.genGetter(): String { return StrUtil.genGetter(this) } /** * 移除字符串中所有给定字符串

* 例:removeAll("aa-bb-cc-dd", "-") =》 aabbccdd * * @param str 字符串 * @param strToRemove 被移除的字符串 * @return 移除后的字符串 */ fun CharSequence?.removeAll(strToRemove: CharSequence?): String { return StrUtil.removeAll(this ?: "", strToRemove ?: "") } /** * 去除字符串中指定的多个字符,如有多个则全部去除 * * @param str 字符串 * @param chars 字符列表 * @return 去除后的字符 * @since 4.2.2 */ fun CharSequence?.removeAll(vararg chars: Char): String { return StrUtil.removeAll(this ?: "", *chars) } /** * 去除所有换行符,包括: * *
 * 1. \r
 * 1. \n
* * * @param str 字符串 * @return 处理后的字符串 * @since 4.2.2 */ fun CharSequence?.removeAllLineBreaks(): String { return StrUtil.removeAllLineBreaks(this ?: "") } /** * 去掉首部指定长度的字符串并将剩余字符串首字母小写

* 例如:str=setName, preLength=3 =》 return name * * @param str 被处理的字符串 * @param preLength 去掉的长度 * @return 处理后的字符串,不符合规范返回null */ fun CharSequence?.removePreAndLowerFirst(preLength: Int): String { return StrUtil.removePreAndLowerFirst(this ?: "", preLength) } /** * 去掉首部指定长度的字符串并将剩余字符串首字母小写

* 例如:str=setName, prefix=set =》 return name * * @param str 被处理的字符串 * @param prefix 前缀 * @return 处理后的字符串,不符合规范返回null */ fun CharSequence?.removePreAndLowerFirst(prefix: CharSequence?): String { return StrUtil.removePreAndLowerFirst(this ?: "", prefix ?: "") } /** * 原字符串首字母大写并在其首部添加指定字符串 例如:str=name, preString=get =》 return getName * * @param str 被处理的字符串 * @param preString 添加的首部 * @return 处理后的字符串 */ fun CharSequence?.upperFirstAndAddPre(preString: String?): String { return StrUtil.upperFirstAndAddPre(this ?: "", preString ?: "") } /** * 大写首字母

* 例如:str = name, return Name * * @param str 字符串 * @return 字符串 */ fun CharSequence?.upperFirst(): String { return StrUtil.upperFirst(this ?: "") } /** * 小写首字母

* 例如:str = Name, return name * * @param str 字符串 * @return 字符串 */ fun CharSequence?.lowerFirst(): String { return StrUtil.lowerFirst(this ?: "") } /** * 去掉指定前缀 * * @param str 字符串 * @param prefix 前缀 * @return 切掉后的字符串,若前缀不是 preffix, 返回原字符串 */ fun CharSequence?.removePrefix(prefix: CharSequence?): String { return StrUtil.removePrefix(this ?: "", prefix ?: "") } /** * 忽略大小写去掉指定前缀 * * @param str 字符串 * @param prefix 前缀 * @return 切掉后的字符串,若前缀不是 prefix, 返回原字符串 */ fun CharSequence?.removePrefixIgnoreCase(prefix: CharSequence?): String { return StrUtil.removePrefixIgnoreCase(this ?: "", prefix ?: "") } /** * 去掉指定后缀 * * @param str 字符串 * @param suffix 后缀 * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串 */ fun CharSequence?.removeSuffix(suffix: CharSequence?): String { return StrUtil.removeSuffix(this ?: "", suffix ?: "") } /** * 去掉指定后缀,并小写首字母 * * @param str 字符串 * @param suffix 后缀 * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串 */ fun CharSequence?.removeSufAndLowerFirst(suffix: CharSequence?): String { return StrUtil.removeSufAndLowerFirst(this ?: "", suffix ?: "") } /** * 忽略大小写去掉指定后缀 * * @param str 字符串 * @param suffix 后缀 * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串 */ fun CharSequence?.removeSuffixIgnoreCase(suffix: CharSequence?): String { return StrUtil.removeSuffixIgnoreCase(this ?: "", suffix ?: "") } /** * 去除两边的指定字符串 * * @param str 被处理的字符串 * @param prefixOrSuffix 前缀或后缀 * @return 处理后的字符串 * @since 3.1.2 */ fun CharSequence?.strip(prefixOrSuffix: CharSequence?): String { return StrUtil.strip(this ?: "", prefixOrSuffix ?: "") } /** * 去除两边的指定字符串 * * @param str 被处理的字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 处理后的字符串 * @since 3.1.2 */ fun CharSequence?.strip(prefix: CharSequence?, suffix: CharSequence?): String { return StrUtil.strip(this ?: "", prefix ?: "", suffix ?: "") } /** * 去除两边的指定字符串,忽略大小写 * * @param str 被处理的字符串 * @param prefixOrSuffix 前缀或后缀 * @return 处理后的字符串 * @since 3.1.2 */ fun CharSequence?.stripIgnoreCase(prefixOrSuffix: CharSequence?): String { return StrUtil.stripIgnoreCase(this ?: "", prefixOrSuffix ?: "") } /** * 去除两边的指定字符串,忽略大小写 * * @param str 被处理的字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 处理后的字符串 * @since 3.1.2 */ fun CharSequence?.stripIgnoreCase(prefix: CharSequence?, suffix: CharSequence?): String { return StrUtil.stripIgnoreCase(this ?: "", prefix ?: "", suffix ?: "") } /** * 如果给定字符串不是以prefix开头的,在开头补充 prefix * * @param str 字符串 * @param prefix 前缀 * @return 补充后的字符串 */ fun CharSequence?.addPrefixIfNot(prefix: CharSequence?): String { return StrUtil.addPrefixIfNot(this ?: "", prefix ?: "") } /** * 如果给定字符串不是以suffix结尾的,在尾部补充 suffix * * @param str 字符串 * @param suffix 后缀 * @return 补充后的字符串 */ fun CharSequence?.addSuffixIfNot(suffix: CharSequence?): String { return StrUtil.addSuffixIfNot(this ?: "", suffix ?: "") } /** * 清理空白字符 * * @param str 被清理的字符串 * @return 清理后的字符串 */ fun CharSequence?.cleanBlank(): String { return StrUtil.cleanBlank(this ?: "") } /** * 改进JDK subString

* index从0开始计算,最后一个字符为-1

* 如果from和to位置一样,返回 ""

* 如果from或to为负数,则按照length从后向前数位置,如果绝对值大于字符串长度,则from归到0,to归到length

* 如果经过修正的index中from大于to,则互换from和to example:

* abcdefgh 2 3 =》 c

* abcdefgh 2 -3 =》 cde

* * @param str String * @param fromIndex 开始的index(包括) * @param toIndex 结束的index(不包括) * @return 字串 */ fun CharSequence?.sub(fromIndex: Int, toIndex: Int): String { return StrUtil.sub(this ?: "", fromIndex, toIndex) } /** * 通过CodePoint截取字符串,可以截断Emoji * * @param str String * @param fromIndex 开始的index(包括) * @param toIndex 结束的index(不包括) * @return 字串 */ fun CharSequence?.subByCodePoint(fromIndex: Int, toIndex: Int): String { return StrUtil.subByCodePoint(this ?: "", fromIndex, toIndex) } /** * 截取部分字符串,这里一个汉字的长度认为是2 * * @param str 字符串 * @param len 切割的位置 * @param suffix 切割后加上后缀 * @return 切割后的字符串 * @since 3.1.1 */ fun CharSequence?.subPreGbk(len: Int, suffix: CharSequence?): String { return StrUtil.subPreGbk(this ?: "", len, suffix ?: "") } /** * 限制字符串长度,如果超过指定长度,截取指定长度并在末尾加"..." * * @param string 字符串 * @param length 最大长度 * @return 切割后的剩余的前半部分字符串+"..." * @since 4.0.10 */ fun CharSequence?.maxLength(length: Int): String { return StrUtil.maxLength(this ?: "", length) } /** * 切割指定位置之前部分的字符串 * * @param string 字符串 * @param toIndex 切割到的位置(不包括) * @return 切割后的剩余的前半部分字符串 */ fun CharSequence?.subPre(toIndex: Int): String { return StrUtil.subPre(this ?: "", toIndex) } /** * 切割指定位置之后部分的字符串 * * @param string 字符串 * @param fromIndex 切割开始的位置(包括) * @return 切割后后剩余的后半部分字符串 */ fun CharSequence?.subSuf(fromIndex: Int): String { return StrUtil.subSuf(this ?: "", fromIndex) } /** * 切割指定长度的后部分的字符串 * *
 * StrUtil.subSufByLength("abcde", 3)      =    "cde"
 * StrUtil.subSufByLength("abcde", 0)      =    ""
 * StrUtil.subSufByLength("abcde", -5)     =    ""
 * StrUtil.subSufByLength("abcde", -1)     =    ""
 * StrUtil.subSufByLength("abcde", 5)       =    "abcde"
 * StrUtil.subSufByLength("abcde", 10)     =    "abcde"
 * StrUtil.subSufByLength(null, 3)               =    null
* * * @param string 字符串 * @param length 切割长度 * @return 切割后后剩余的后半部分字符串 * @since 4.0.1 */ fun CharSequence?.subSufByLength(length: Int): String { return StrUtil.subSufByLength(this ?: "", length) } /** * 截取字符串,从指定位置开始,截取指定长度的字符串

* author weibaohui * * @param input 原始字符串 * @param fromIndex 开始的index,包括 * @param length 要截取的长度 * @return 截取后的字符串 */ fun String?.subWithLength(fromIndex: Int, length: Int): String { return StrUtil.subWithLength(this ?: "", fromIndex, length) } /** * 截取分隔字符串之前的字符串,不包括分隔字符串

* 如果给定的字符串为空串(null或"")或者分隔字符串为null,返回原字符串

* 如果分隔字符串为空串"",则返回空串,如果分隔字符串未找到,返回原字符串,举例如下: * *
 * StrUtil.subBefore(null, *, false)      = null
 * StrUtil.subBefore("", *, false)        = ""
 * StrUtil.subBefore("abc", "a", false)   = ""
 * StrUtil.subBefore("abcba", "b", false) = "a"
 * StrUtil.subBefore("abc", "c", false)   = "ab"
 * StrUtil.subBefore("abc", "d", false)   = "abc"
 * StrUtil.subBefore("abc", "", false)    = ""
 * StrUtil.subBefore("abc", null, false)  = "abc"
* * * @param string 被查找的字符串 * @param separator 分隔字符串(不包括) * @param isLastSeparator 是否查找最后一个分隔字符串(多次出现分隔字符串时选取最后一个),true为选取最后一个 * @return 切割后的字符串 * @since 3.1.1 */ fun CharSequence?.subBefore(separator: CharSequence?, isLastSeparator: Boolean): String { return StrUtil.subBefore(this ?: "", separator, isLastSeparator) } /** * 截取分隔字符串之前的字符串,不包括分隔字符串

* 如果给定的字符串为空串(null或"")或者分隔字符串为null,返回原字符串

* 如果分隔字符串未找到,返回原字符串,举例如下: * *
 * StrUtil.subBefore(null, *, false)      = null
 * StrUtil.subBefore("", *, false)        = ""
 * StrUtil.subBefore("abc", 'a', false)   = ""
 * StrUtil.subBefore("abcba", 'b', false) = "a"
 * StrUtil.subBefore("abc", 'c', false)   = "ab"
 * StrUtil.subBefore("abc", 'd', false)   = "abc"
* * * @param string 被查找的字符串 * @param separator 分隔字符串(不包括) * @param isLastSeparator 是否查找最后一个分隔字符串(多次出现分隔字符串时选取最后一个),true为选取最后一个 * @return 切割后的字符串 * @since 4.1.15 */ fun CharSequence?.subBefore(separator: Char, isLastSeparator: Boolean): String { return StrUtil.subBefore(this ?: "", separator, isLastSeparator) } /** * 截取分隔字符串之后的字符串,不包括分隔字符串

* 如果给定的字符串为空串(null或""),返回原字符串

* 如果分隔字符串为空串(null或""),则返回空串,如果分隔字符串未找到,返回空串,举例如下: * *
 * StrUtil.subAfter(null, *, false)      = null
 * StrUtil.subAfter("", *, false)        = ""
 * StrUtil.subAfter(*, null, false)      = ""
 * StrUtil.subAfter("abc", "a", false)   = "bc"
 * StrUtil.subAfter("abcba", "b", false) = "cba"
 * StrUtil.subAfter("abc", "c", false)   = ""
 * StrUtil.subAfter("abc", "d", false)   = ""
 * StrUtil.subAfter("abc", "", false)    = "abc"
* * * @param string 被查找的字符串 * @param separator 分隔字符串(不包括) * @param isLastSeparator 是否查找最后一个分隔字符串(多次出现分隔字符串时选取最后一个),true为选取最后一个 * @return 切割后的字符串 * @since 3.1.1 */ fun CharSequence?.subAfter(separator: CharSequence, isLastSeparator: Boolean): String { return StrUtil.subAfter(this ?: "", separator, isLastSeparator) } /** * 截取分隔字符串之后的字符串,不包括分隔字符串

* 如果给定的字符串为空串(null或""),返回原字符串

* 如果分隔字符串为空串(null或""),则返回空串,如果分隔字符串未找到,返回空串,举例如下: * *
 * StrUtil.subAfter(null, *, false)      = null
 * StrUtil.subAfter("", *, false)        = ""
 * StrUtil.subAfter("abc", 'a', false)   = "bc"
 * StrUtil.subAfter("abcba", 'b', false) = "cba"
 * StrUtil.subAfter("abc", 'c', false)   = ""
 * StrUtil.subAfter("abc", 'd', false)   = ""
* * * @param string 被查找的字符串 * @param separator 分隔字符串(不包括) * @param isLastSeparator 是否查找最后一个分隔字符串(多次出现分隔字符串时选取最后一个),true为选取最后一个 * @return 切割后的字符串 * @since 4.1.15 */ fun CharSequence?.subAfter(separator: Char, isLastSeparator: Boolean): String { return StrUtil.subAfter(this ?: "", separator, isLastSeparator) } /** * 截取指定字符串中间部分,不包括标识字符串

* * * 栗子: * *
 * StrUtil.subBetween("wx[b]yz", "[", "]") = "b"
 * StrUtil.subBetween(null, *, *)          = null
 * StrUtil.subBetween(*, null, *)          = null
 * StrUtil.subBetween(*, *, null)          = null
 * StrUtil.subBetween("", "", "")          = ""
 * StrUtil.subBetween("", "", "]")         = null
 * StrUtil.subBetween("", "[", "]")        = null
 * StrUtil.subBetween("yabcz", "", "")     = ""
 * StrUtil.subBetween("yabcz", "y", "z")   = "abc"
 * StrUtil.subBetween("yabczyabcz", "y", "z")   = "abc"
* * * @param str 被切割的字符串 * @param before 截取开始的字符串标识 * @param after 截取到的字符串标识 * @return 截取后的字符串 * @since 3.1.1 */ fun CharSequence?.subBetween(before: CharSequence?, after: CharSequence?): String { return StrUtil.subBetween(this ?: "", before ?: "", after ?: "") } /** * 截取指定字符串中间部分,不包括标识字符串

* * * 栗子: * *
 * StrUtil.subBetween(null, *)            = null
 * StrUtil.subBetween("", "")             = ""
 * StrUtil.subBetween("", "tag")          = null
 * StrUtil.subBetween("tagabctag", null)  = null
 * StrUtil.subBetween("tagabctag", "")    = ""
 * StrUtil.subBetween("tagabctag", "tag") = "abc"
* * * @param str 被切割的字符串 * @param beforeAndAfter 截取开始和结束的字符串标识 * @return 截取后的字符串 * @since 3.1.1 */ fun CharSequence?.subBetween(beforeAndAfter: CharSequence?): String { return StrUtil.subBetween(this ?: "", beforeAndAfter ?: "") } /** * 给定字符串是否被字符包围 * * @param str 字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 是否包围,空串不包围 */ fun CharSequence?.isSurround(prefix: CharSequence?, suffix: CharSequence?): Boolean { return StrUtil.isSurround(this ?: "", prefix ?: "", suffix ?: "") } /** * 给定字符串是否被字符包围 * * @param str 字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 是否包围,空串不包围 */ fun CharSequence?.isSurround(prefix: Char, suffix: Char): Boolean { return StrUtil.isSurround(this ?: "", prefix, suffix) } /** * 重复某个字符 * * @param c 被重复的字符 * @param count 重复的数目,如果小于等于0则返回"" * @return 重复字符字符串 */ fun repeat(c: Char, count: Int): String { return StrUtil.repeat(c, count) } /** * 重复某个字符串 * * @param str 被重复的字符 * @param count 重复的数目 * @return 重复字符字符串 */ fun CharSequence?.repeat(count: Int): String { return StrUtil.repeat(this ?: "", count) } /** * 重复某个字符串到指定长度 * * @param str 被重复的字符 * @param padLen 指定长度 * @return 重复字符字符串 * @since 4.3.2 */ fun CharSequence?.repeatByLength(padLen: Int): String { return StrUtil.repeatByLength(this ?: "", padLen) } /** * 重复某个字符串并通过分界符连接 * *
 * StrUtil.repeatAndJoin("?", 5, ",")   = "?,?,?,?,?"
 * StrUtil.repeatAndJoin("?", 0, ",")   = ""
 * StrUtil.repeatAndJoin("?", 5, null) = "?????"
* * * @param str 被重复的字符串 * @param count 数量 * @param conjunction 分界符 * @return 连接后的字符串 * @since 4.0.1 */ fun CharSequence?.repeatAndJoin(count: Int, conjunction: CharSequence?): String { return StrUtil.repeatAndJoin(this ?: "", count, conjunction ?: ",") } /** * 比较两个字符串(大小写敏感)。 * *
 * equals(null, null)   = true
 * equals(null, "abc")  = false
 * equals("abc", null)  = false
 * equals("abc", "abc") = true
 * equals("abc", "ABC") = false
* * * @param str1 要比较的字符串1 * @param str2 要比较的字符串2 * @return 如果两个字符串相同,或者都是`null`,则返回`true` */ fun CharSequence?.equals(str2: CharSequence?): Boolean { return StrUtil.equals(this, str2) } /** * 比较两个字符串(大小写不敏感)。 * *
 * equalsIgnoreCase(null, null)   = true
 * equalsIgnoreCase(null, "abc")  = false
 * equalsIgnoreCase("abc", null)  = false
 * equalsIgnoreCase("abc", "abc") = true
 * equalsIgnoreCase("abc", "ABC") = true
* * * @param str1 要比较的字符串1 * @param str2 要比较的字符串2 * @return 如果两个字符串相同,或者都是`null`,则返回`true` */ fun CharSequence?.equalsIgnoreCase(str2: CharSequence?): Boolean { return StrUtil.equalsIgnoreCase(this, str2) } /** * 比较两个字符串是否相等。 * * @param str1 要比较的字符串1 * @param str2 要比较的字符串2 * @param ignoreCase 是否忽略大小写 * @return 如果两个字符串相同,或者都是`null`,则返回`true` * @since 3.2.0 */ fun CharSequence?.equals(str2: CharSequence?, ignoreCase: Boolean): Boolean { return StrUtil.equals(this, str2, ignoreCase) } /** * 将对象转为字符串

* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 * * @param obj 对象 * @return 字符串 */ fun Any?.utf8Str(): String { this ?: return "" return StrUtil.utf8Str(this) } /** * 将对象转为字符串 * *
 * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
 * 2、对象数组会调用Arrays.toString方法
* * * @param obj 对象 * @param charsetName 字符集 * @return 字符串 */ fun Any?.str(charsetName: String): String { return StrUtil.str(this ?: return "", charsetName) } /** * 将对象转为字符串 *
 * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
 * 2、对象数组会调用Arrays.toString方法
* * * @param obj 对象 * @param charset 字符集 * @return 字符串 */ fun Any?.str(charset: Charset): String { return StrUtil.str(this ?: return "", charset) } /** * 将byte数组转为字符串 * * @param bytes byte数组 * @param charset 字符集 * @return 字符串 */ fun ByteArray?.str(charset: String): String { return StrUtil.str(this ?: return "", charset) } /** * 解码字节码 * * @param data 字符串 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 * @return 解码后的字符串 */ fun ByteArray?.str(charset: Charset?): String { return StrUtil.str(this ?: return "", charset ?: Charsets.UTF_8) } /** * 将Byte数组转为字符串 * * @param bytes byte数组 * @param charset 字符集 * @return 字符串 */ fun Array?.str(bytes: Array?, charset: String?): String { this ?: return "" return StrUtil.str(this, charset ?: Charsets.UTF_8.name()) } /** * 解码字节码 * * @param data 字符串 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 * @return 解码后的字符串 */ fun Array?.str(charset: Charset?): String { return StrUtil.str(this ?: return "", charset ?: Charsets.UTF_8) } /** * 将编码的byteBuffer数据转换为字符串 * * @param data 数据 * @param charset 字符集,如果为空使用当前系统字符集 * @return 字符串 */ fun ByteBuffer?.str(charset: String?): String { return StrUtil.str(this ?: return "", charset ?: Charsets.UTF_8.name()) } /** * 将编码的byteBuffer数据转换为字符串 * * @param data 数据 * @param charset 字符集,如果为空使用当前系统字符集 * @return 字符串 */ fun ByteBuffer?.str(charset: Charset?): String { return StrUtil.str(this ?: return "", charset ?: Charsets.UTF_8) } /** * 字符串转换为byteBuffer * * @param str 字符串 * @param charset 编码 * @return byteBuffer */ fun CharSequence?.byteBuffer(charset: String?): ByteBuffer { return StrUtil.byteBuffer(this ?: "", charset ?: Charsets.UTF_8.name()) } /** * 将驼峰式命名的字符串转换为下划线方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。

* 例如: * *
 * HelloWorld=》hello_world
 * Hello_World=》hello_world
 * HelloWorld_test=》hello_world_test
* * * @param str 转换前的驼峰式命名的字符串,也可以为下划线形式 * @return 转换后下划线方式命名的字符串 */ fun CharSequence?.toUnderlineCase(): String { return StrUtil.toUnderlineCase(this ?: return "") } /** * 将驼峰式命名的字符串转换为使用符号连接方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。

* * @param str 转换前的驼峰式命名的字符串,也可以为符号连接形式 * @param symbol 连接符 * @return 转换后符号连接方式命名的字符串 * @since 4.0.10 */ fun CharSequence?.toSymbolCase(symbol: Char): String { return StrUtil.toSymbolCase(this ?: return "", symbol) } /** * 将下划线方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。

* 例如:hello_world=》helloWorld * * @param name 转换前的下划线大写方式命名的字符串 * @return 转换后的驼峰式命名的字符串 */ fun CharSequence?.toCamelCase(): String { return StrUtil.toCamelCase(this ?: return "") } /** * 包装指定字符串

* 当前缀和后缀一致时使用此方法 * * @param str 被包装的字符串 * @param prefixAndSuffix 前缀和后缀 * @return 包装后的字符串 * @since 3.1.0 */ fun CharSequence?.wrap(prefixAndSuffix: CharSequence?): String { return StrUtil.wrap(this ?: "", prefixAndSuffix ?: "") } /** * 包装指定字符串 * * @param str 被包装的字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 包装后的字符串 */ fun CharSequence?.wrap(prefix: CharSequence?, suffix: CharSequence?): String { return StrUtil.wrap(this ?: "", prefix ?: "", suffix ?: "") } /** * 包装指定字符串,如果前缀或后缀已经包含对应的字符串,则不再包装 * * @param str 被包装的字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 包装后的字符串 */ fun CharSequence?.wrapIfMissing(prefix: CharSequence?, suffix: CharSequence?): String { return StrUtil.wrapIfMissing(this ?: "", prefix ?: "", suffix ?: "") } /** * 去掉字符包装,如果未被包装则返回原字符串 * * @param str 字符串 * @param prefix 前置字符串 * @param suffix 后置字符串 * @return 去掉包装字符的字符串 * @since 4.0.1 */ fun CharSequence?.unWrap(prefix: String?, suffix: String?): String { return StrUtil.unWrap(this ?: "", prefix ?: "", suffix ?: "") } /** * 去掉字符包装,如果未被包装则返回原字符串 * * @param str 字符串 * @param prefix 前置字符 * @param suffix 后置字符 * @return 去掉包装字符的字符串 * @since 4.0.1 */ fun CharSequence?.unWrap(prefix: Char, suffix: Char): String { return StrUtil.unWrap(this ?: "", prefix, suffix) } /** * 去掉字符包装,如果未被包装则返回原字符串 * * @param str 字符串 * @param prefixAndSuffix 前置和后置字符 * @return 去掉包装字符的字符串 * @since 4.0.1 */ fun CharSequence?.unWrap(prefixAndSuffix: Char): String { return StrUtil.unWrap(this ?: "", prefixAndSuffix) } /** * 指定字符串是否被包装 * * @param str 字符串 * @param prefix 前缀 * @param suffix 后缀 * @return 是否被包装 */ fun CharSequence?.isWrap(prefix: String?, suffix: String?): Boolean { return StrUtil.isWrap(this ?: "", prefix ?: "", suffix ?: "") } /** * 指定字符串是否被同一字符包装(前后都有这些字符串) * * @param str 字符串 * @param wrapper 包装字符串 * @return 是否被包装 */ fun CharSequence?.isWrap(wrapper: String?): Boolean { return StrUtil.isWrap(this ?: "", wrapper ?: "") } /** * 指定字符串是否被同一字符包装(前后都有这些字符串) * * @param str 字符串 * @param wrapper 包装字符 * @return 是否被包装 */ fun CharSequence?.isWrap(wrapper: Char): Boolean { return StrUtil.isWrap(this ?: "", wrapper) } /** * 指定字符串是否被包装 * * @param str 字符串 * @param prefixChar 前缀 * @param suffixChar 后缀 * @return 是否被包装 */ fun CharSequence?.isWrap(prefixChar: Char, suffixChar: Char): Boolean { return StrUtil.isWrap(this ?: "", prefixChar, suffixChar) } /** * 补充字符串以满足最小长度 * *
 * StrUtil.padPre(null, *, *);//null
 * StrUtil.padPre("1", 3, "ABC");//"AB1"
 * StrUtil.padPre("123", 2, "ABC");//"12"
* * * @param str 字符串 * @param minLength 最小长度 * @param padStr 补充的字符 * @return 补充后的字符串 */ fun CharSequence?.padPre(minLength: Int, padStr: CharSequence?): String { return StrUtil.padPre(this ?: "", minLength, padStr ?: "") } /** * 补充字符串以满足最小长度 * *
 * StrUtil.padPre(null, *, *);//null
 * StrUtil.padPre("1", 3, '0');//"001"
 * StrUtil.padPre("123", 2, '0');//"12"
* * * @param str 字符串 * @param minLength 最小长度 * @param padChar 补充的字符 * @return 补充后的字符串 */ fun CharSequence?.padPre(minLength: Int, padChar: Char): String { return StrUtil.padPre(this ?: "", minLength, padChar) } /** * 补充字符串以满足最小长度 * *
 * StrUtil.padAfter(null, *, *);//null
 * StrUtil.padAfter("1", 3, '0');//"100"
 * StrUtil.padAfter("123", 2, '0');//"23"
* * * @param str 字符串,如果为`null`,直接返回null * @param minLength 最小长度 * @param padChar 补充的字符 * @return 补充后的字符串 */ fun CharSequence?.padAfter(minLength: Int, padChar: Char): String { return StrUtil.padAfter(this ?: "", minLength, padChar) } /** * 补充字符串以满足最小长度 * *
 * StrUtil.padAfter(null, *, *);//null
 * StrUtil.padAfter("1", 3, "ABC");//"1AB"
 * StrUtil.padAfter("123", 2, "ABC");//"23"
* * * @param str 字符串,如果为`null`,直接返回null * @param minLength 最小长度 * @param padStr 补充的字符 * @return 补充后的字符串 * @since 4.3.2 */ fun CharSequence?.padAfter(minLength: Int, padStr: CharSequence?): String { return StrUtil.padAfter(this ?: "", minLength, padStr ?: "") } /** * 居中字符串,两边补充指定字符串,如果指定长度小于字符串,则返回原字符串 * *
 * StrUtil.center(null, *)   = null
 * StrUtil.center("", 4)     = "    "
 * StrUtil.center("ab", -1)  = "ab"
 * StrUtil.center("ab", 4)   = " ab "
 * StrUtil.center("abcd", 2) = "abcd"
 * StrUtil.center("a", 4)    = " a  "
* * * @param str 字符串 * @param size 指定长度 * @return 补充后的字符串 * @since 4.3.2 */ fun CharSequence?.center(size: Int): String { return StrUtil.center(this ?: "", size) } /** * 居中字符串,两边补充指定字符串,如果指定长度小于字符串,则返回原字符串 * *
 * StrUtil.center(null, *, *)     = null
 * StrUtil.center("", 4, ' ')     = "    "
 * StrUtil.center("ab", -1, ' ')  = "ab"
 * StrUtil.center("ab", 4, ' ')   = " ab "
 * StrUtil.center("abcd", 2, ' ') = "abcd"
 * StrUtil.center("a", 4, ' ')    = " a  "
 * StrUtil.center("a", 4, 'y')   = "yayy"
 * StrUtil.center("abc", 7, ' ')   = "  abc  "
* * * @param str 字符串 * @param size 指定长度 * @param padChar 两边补充的字符 * @return 补充后的字符串 * @since 4.3.2 */ fun CharSequence?.center(size: Int, padChar: Char): String { return StrUtil.center(this ?: "", size, padChar) } /** * 居中字符串,两边补充指定字符串,如果指定长度小于字符串,则返回原字符串 * *
 * StrUtil.center(null, *, *)     = null
 * StrUtil.center("", 4, " ")     = "    "
 * StrUtil.center("ab", -1, " ")  = "ab"
 * StrUtil.center("ab", 4, " ")   = " ab "
 * StrUtil.center("abcd", 2, " ") = "abcd"
 * StrUtil.center("a", 4, " ")    = " a  "
 * StrUtil.center("a", 4, "yz")   = "yayz"
 * StrUtil.center("abc", 7, null) = "  abc  "
 * StrUtil.center("abc", 7, "")   = "  abc  "
* * * @param str 字符串 * @param size 指定长度 * @param padStr 两边补充的字符串 * @return 补充后的字符串 */ fun CharSequence?.center(size: Int, padStr: CharSequence?): String { return StrUtil.center(this ?: "", size, padStr ?: "") } /** * 创建StringBuilder对象 * * @return StringBuilder对象 */ fun String.builder(): StringBuilder { return StrUtil.builder(this) } /** * 获得StringReader * * @param str 字符串 * @return StringReader */ fun CharSequence?.getReader(): StringReader { return StrUtil.getReader(this ?: "") } /** * 统计指定内容中包含指定字符的数量 * * @param content 内容 * @param charForSearch 被统计的字符 * @return 包含数量 */ fun count(content: CharSequence?, charForSearch: Char): Int { return StrUtil.count(content ?: "", charForSearch) } /** * 将给定字符串,变成 "xxx...xxx" 形式的字符串 * * @param str 字符串 * @param maxLength 最大长度 * @return 截取后的字符串 */ fun CharSequence?.brief(maxLength: Int): String { return StrUtil.brief(this ?: "", maxLength) } /** * 比较两个版本

* null版本排在最小:即: * *
 * StrUtil.compareVersion(null, "v1") < 0
 * StrUtil.compareVersion("v1", "v1")  = 0
 * StrUtil.compareVersion(null, null)   = 0
 * StrUtil.compareVersion("v1", null) > 0
 * StrUtil.compareVersion("1.0.0", "1.0.2") < 0
 * StrUtil.compareVersion("1.0.2", "1.0.2a") < 0
 * StrUtil.compareVersion("1.13.0", "1.12.1c") > 0
 * StrUtil.compareVersion("V0.0.20170102", "V0.0.20170101") > 0
* * * @param version1 版本1 * @param version2 版本2 * @return 排序值。负数:version1 < version2,正数:version1 > version2, 0:version1 == version2 * @since 4.0.2 */ fun CharSequence?.compareVersion(version2: CharSequence?): Int { return StrUtil.compareVersion(this, version2) } /** * 指定范围内查找指定字符 * * @param str 字符串 * @param searchChar 被查找的字符 * @return 位置 */ fun CharSequence?.indexOf(searchChar: Char): Int { return StrUtil.indexOf(this ?: "", searchChar) } /** * 指定范围内查找指定字符 * * @param str 字符串 * @param searchChar 被查找的字符 * @param start 起始位置,如果小于0,从0开始查找 * @return 位置 */ fun CharSequence?.indexOf(searchChar: Char, start: Int): Int { return StrUtil.indexOf(this ?: "", searchChar, start) } /** * 指定范围内查找指定字符 * * @param str 字符串 * @param searchChar 被查找的字符 * @param start 起始位置,如果小于0,从0开始查找 * @param end 终止位置,如果超过str.length()则默认查找到字符串末尾 * @return 位置 */ fun CharSequence?.indexOf(searchChar: Char, start: Int, end: Int): Int { return StrUtil.indexOf(this ?: "", searchChar, start, end) } /** * 指定范围内查找字符串,忽略大小写

* *
 * StrUtil.indexOfIgnoreCase(null, *, *)          = -1
 * StrUtil.indexOfIgnoreCase(*, null, *)          = -1
 * StrUtil.indexOfIgnoreCase("", "", 0)           = 0
 * StrUtil.indexOfIgnoreCase("aabaabaa", "A", 0)  = 0
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", 0)  = 2
 * StrUtil.indexOfIgnoreCase("aabaabaa", "AB", 0) = 1
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", 3)  = 5
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", 9)  = -1
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", -1) = 2
 * StrUtil.indexOfIgnoreCase("aabaabaa", "", 2)   = 2
 * StrUtil.indexOfIgnoreCase("abc", "", 9)        = -1
* * * @param str 字符串 * @param searchStr 需要查找位置的字符串 * @return 位置 * @since 3.2.1 */ fun CharSequence?.indexOfIgnoreCase(searchStr: CharSequence?): Int { return StrUtil.indexOfIgnoreCase(this ?: "", searchStr ?: "") } /** * 指定范围内查找字符串 * *
 * StrUtil.indexOfIgnoreCase(null, *, *)          = -1
 * StrUtil.indexOfIgnoreCase(*, null, *)          = -1
 * StrUtil.indexOfIgnoreCase("", "", 0)           = 0
 * StrUtil.indexOfIgnoreCase("aabaabaa", "A", 0)  = 0
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", 0)  = 2
 * StrUtil.indexOfIgnoreCase("aabaabaa", "AB", 0) = 1
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", 3)  = 5
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", 9)  = -1
 * StrUtil.indexOfIgnoreCase("aabaabaa", "B", -1) = 2
 * StrUtil.indexOfIgnoreCase("aabaabaa", "", 2)   = 2
 * StrUtil.indexOfIgnoreCase("abc", "", 9)        = -1
* * * @param str 字符串 * @param searchStr 需要查找位置的字符串 * @param fromIndex 起始位置 * @return 位置 * @since 3.2.1 */ fun CharSequence?.indexOfIgnoreCase(searchStr: CharSequence?, fromIndex: Int): Int { return StrUtil.indexOfIgnoreCase(this ?: "", searchStr ?: "", fromIndex) } /** * 指定范围内查找字符串 * * @param str 字符串 * @param searchStr 需要查找位置的字符串 * @param fromIndex 起始位置 * @param ignoreCase 是否忽略大小写 * @return 位置 * @since 3.2.1 */ fun CharSequence?.indexOf(searchStr: CharSequence?, fromIndex: Int, ignoreCase: Boolean): Int { return StrUtil.indexOf(this ?: "", searchStr ?: "", fromIndex, ignoreCase) } /** * 指定范围内查找字符串,忽略大小写 * * @param str 字符串 * @param searchStr 需要查找位置的字符串 * @return 位置 * @since 3.2.1 */ fun CharSequence?.lastIndexOfIgnoreCase(searchStr: CharSequence?): Int { return StrUtil.lastIndexOfIgnoreCase(this ?: "", searchStr ?: "") } /** * 指定范围内查找字符串,忽略大小写

* fromIndex 为搜索起始位置,从后往前计数 * * @param str 字符串 * @param searchStr 需要查找位置的字符串 * @param fromIndex 起始位置,从后往前计数 * @return 位置 * @since 3.2.1 */ fun CharSequence?.lastIndexOfIgnoreCase(searchStr: CharSequence?, fromIndex: Int): Int { return StrUtil.lastIndexOfIgnoreCase(this ?: "", searchStr ?: "", fromIndex) } /** * 指定范围内查找字符串

* fromIndex 为搜索起始位置,从后往前计数 * * @param str 字符串 * @param searchStr 需要查找位置的字符串 * @param fromIndex 起始位置,从后往前计数 * @param ignoreCase 是否忽略大小写 * @return 位置 * @since 3.2.1 */ fun CharSequence?.lastIndexOf(searchStr: CharSequence?, fromIndex: Int, ignoreCase: Boolean): Int { return StrUtil.lastIndexOf(this ?: "", searchStr ?: "", fromIndex, ignoreCase) } /** * 返回字符串 searchStr 在字符串 str 中第 ordinal 次出现的位置。 * * * * 如果 str=null 或 searchStr=null 或 ordinal0 则返回-1

* 此方法来自:Apache-Commons-Lang * * * 例子(*代表任意字符): * *
 * StrUtil.ordinalIndexOf(null, *, *)          = -1
 * StrUtil.ordinalIndexOf(*, null, *)          = -1
 * StrUtil.ordinalIndexOf("", "", *)           = 0
 * StrUtil.ordinalIndexOf("aabaabaa", "a", 1)  = 0
 * StrUtil.ordinalIndexOf("aabaabaa", "a", 2)  = 1
 * StrUtil.ordinalIndexOf("aabaabaa", "b", 1)  = 2
 * StrUtil.ordinalIndexOf("aabaabaa", "b", 2)  = 5
 * StrUtil.ordinalIndexOf("aabaabaa", "ab", 1) = 1
 * StrUtil.ordinalIndexOf("aabaabaa", "ab", 2) = 4
 * StrUtil.ordinalIndexOf("aabaabaa", "", 1)   = 0
 * StrUtil.ordinalIndexOf("aabaabaa", "", 2)   = 0
* * * @param str 被检查的字符串,可以为null * @param searchStr 被查找的字符串,可以为null * @param ordinal 第几次出现的位置 * @return 查找到的位置 * @since 3.2.3 */ fun String?.ordinalIndexOf(searchStr: String?, ordinal: Int): Int { return StrUtil.ordinalIndexOf(this ?: "", searchStr, ordinal) } /** * 如果给定字符串不是以给定的一个或多个字符串为结尾,则在尾部添加结尾字符串

* 不忽略大小写 * * @param str 被检查的字符串 * @param suffix 需要添加到结尾的字符串 * @param suffixes 需要额外检查的结尾字符串,如果以这些中的一个为结尾,则不再添加 * @return 如果已经结尾,返回原字符串,否则返回添加结尾的字符串 * @since 3.0.7 */ fun CharSequence?.appendIfMissing(suffix: CharSequence?, vararg suffixes: CharSequence?): String { return StrUtil.appendIfMissing(this ?: "", suffix ?: "", *suffixes) } /** * 如果给定字符串不是以给定的一个或多个字符串为结尾,则在尾部添加结尾字符串

* 忽略大小写 * * @param str 被检查的字符串 * @param suffix 需要添加到结尾的字符串 * @param suffixes 需要额外检查的结尾字符串,如果以这些中的一个为结尾,则不再添加 * @return 如果已经结尾,返回原字符串,否则返回添加结尾的字符串 * @since 3.0.7 */ fun CharSequence?.appendIfMissingIgnoreCase(suffix: CharSequence?, vararg suffixes: CharSequence?): String { return StrUtil.appendIfMissingIgnoreCase(this ?: "", suffix, *suffixes) } /** * 如果给定字符串不是以给定的一个或多个字符串为开头,则在首部添加起始字符串

* 不忽略大小写 * * @param str 被检查的字符串 * @param prefix 需要添加到首部的字符串 * @param prefixes 需要额外检查的首部字符串,如果以这些中的一个为起始,则不再添加 * @return 如果已经结尾,返回原字符串,否则返回添加结尾的字符串 * @since 3.0.7 */ fun CharSequence?.prependIfMissing(prefix: CharSequence?, vararg prefixes: CharSequence?): String { return StrUtil.prependIfMissing(this ?: "", prefix, *prefixes) } /** * 如果给定字符串不是以给定的一个或多个字符串为开头,则在首部添加起始字符串

* 忽略大小写 * * @param str 被检查的字符串 * @param prefix 需要添加到首部的字符串 * @param prefixes 需要额外检查的首部字符串,如果以这些中的一个为起始,则不再添加 * @return 如果已经结尾,返回原字符串,否则返回添加结尾的字符串 * @since 3.0.7 */ fun CharSequence?.prependIfMissingIgnoreCase(prefix: CharSequence?, vararg prefixes: CharSequence?): String { return StrUtil.prependIfMissingIgnoreCase(this ?: "", prefix, *prefixes) } /** * 反转字符串

* 例如:abcd =》dcba * * @param str 被反转的字符串 * @return 反转后的字符串 * @since 3.0.9 */ fun String?.reverse(): String { return StrUtil.reverse(this ?: "") } /** * 将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串

* 字符填充于字符串前 * * @param str 被填充的字符串 * @param filledChar 填充的字符 * @param len 填充长度 * @return 填充后的字符串 * @since 3.1.2 */ fun String?.fillBefore(filledChar: Char, len: Int): String { return StrUtil.fillBefore(this ?: "", filledChar, len) } /** * 将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串

* 字符填充于字符串后 * * @param str 被填充的字符串 * @param filledChar 填充的字符 * @param len 填充长度 * @return 填充后的字符串 * @since 3.1.2 */ fun String?.fillAfter(filledChar: Char, len: Int): String { return StrUtil.fillAfter(this ?: "", filledChar, len) } /** * 截取两个字符串的不同部分(长度一致),判断截取的子串是否相同

* 任意一个字符串为null返回false * * @param str1 第一个字符串 * @param start1 第一个字符串开始的位置 * @param str2 第二个字符串 * @param start2 第二个字符串开始的位置 * @param length 截取长度 * @param ignoreCase 是否忽略大小写 * @return 子串是否相同 * @since 3.2.1 */ fun CharSequence?.isSubEquals( start1: Int, str2: CharSequence?, start2: Int, length: Int, ignoreCase: Boolean ): Boolean { return StrUtil.isSubEquals(this, start1, str2, start2, length, ignoreCase) } /** * 字符串的每一个字符是否都与定义的匹配器匹配 * * @param value 字符串 * @param matcher 匹配器 * @return 是否全部匹配 * @since 3.2.3 */ fun CharSequence?.isAllCharMatch(matcher: cn.hutool.core.lang.Matcher): Boolean { return StrUtil.isAllCharMatch(this ?: "", matcher) } /** * 替换字符串中的指定字符串,忽略大小写 * * @param str 字符串 * @param searchStr 被查找的字符串 * @param replacement 被替换的字符串 * @return 替换后的字符串 * @since 4.0.3 */ fun CharSequence?.replaceIgnoreCase(searchStr: CharSequence?, replacement: CharSequence?): String { return StrUtil.replaceIgnoreCase(this ?: "", searchStr ?: "", replacement ?: "") } /** * 替换字符串中的指定字符串 * * @param str 字符串 * @param searchStr 被查找的字符串 * @param replacement 被替换的字符串 * @return 替换后的字符串 * @since 4.0.3 */ fun CharSequence?.replace(searchStr: CharSequence?, replacement: CharSequence?): String { return StrUtil.replace(this ?: "", searchStr ?: "", replacement ?: "") } /** * 替换字符串中的指定字符串 * * @param str 字符串 * @param searchStr 被查找的字符串 * @param replacement 被替换的字符串 * @param ignoreCase 是否忽略大小写 * @return 替换后的字符串 * @since 4.0.3 */ fun CharSequence?.replace( searchStr: CharSequence?, replacement: CharSequence?, ignoreCase: Boolean ): String { return StrUtil.replace(this ?: "", searchStr ?: "", replacement ?: "", ignoreCase) } /** * 替换字符串中的指定字符串 * * @param str 字符串 * @param fromIndex 开始位置(包括) * @param searchStr 被查找的字符串 * @param replacement 被替换的字符串 * @param ignoreCase 是否忽略大小写 * @return 替换后的字符串 * @since 4.0.3 */ fun CharSequence?.replace( fromIndex: Int, searchStr: CharSequence?, replacement: CharSequence?, ignoreCase: Boolean ): String { return StrUtil.replace(this ?: "", fromIndex, searchStr ?: "", replacement ?: "", ignoreCase) } /** * 替换指定字符串的指定区间内字符为固定字符 * * @param str 字符串 * @param startInclude 开始位置(包含) * @param endExclude 结束位置(不包含) * @param replacedChar 被替换的字符 * @return 替换后的字符串 * @since 3.2.1 */ fun CharSequence?.replace(startInclude: Int, endExclude: Int, replacedChar: Char): String { return StrUtil.replace(this ?: "", startInclude, endExclude, replacedChar) } /** * 替换指定字符串的指定区间内字符为"*" * * @param str 字符串 * @param startInclude 开始位置(包含) * @param endExclude 结束位置(不包含) * @return 替换后的字符串 * @since 4.1.14 */ fun CharSequence?.hide(startInclude: Int, endExclude: Int): String { return StrUtil.hide(this ?: "", startInclude, endExclude) } /** * 替换字符字符数组中所有的字符为replacedStr

* 提供的chars为所有需要被替换的字符,例如:"\r\n",则"\r"和"\n"都会被替换,哪怕他们单独存在 * * @param str 被检查的字符串 * @param chars 需要替换的字符列表,用一个字符串表示这个字符列表 * @param replacedStr 替换成的字符串 * @return 新字符串 * @since 3.2.2 */ fun CharSequence?.replaceChars(chars: String?, replacedStr: CharSequence?): String { return StrUtil.replaceChars(this ?: "", chars ?: "", replacedStr ?: "") } /** * 替换字符字符数组中所有的字符为replacedStr * * @param str 被检查的字符串 * @param chars 需要替换的字符列表 * @param replacedStr 替换成的字符串 * @return 新字符串 * @since 3.2.2 */ fun CharSequence?.replaceChars(chars: CharArray?, replacedStr: CharSequence?): String { return StrUtil.replaceChars(this ?: "", chars, replacedStr ?: "") } /** * 计算两个字符串的相似度 * * @param str1 字符串1 * @param str2 字符串2 * @return 相似度 * @since 3.2.3 */ fun String?.similar(str2: String?): Double { return StrUtil.similar(this ?: "", str2) } /** * 计算连个字符串的相似度百分比 * * @param str1 字符串1 * @param str2 字符串2 * @param scale 相似度 * @return 相似度百分比 * @since 3.2.3 */ fun String?.similar(str2: String?, scale: Int): String { return StrUtil.similar(this ?: "", str2 ?: "", scale) } /** * 字符串指定位置的字符是否与给定字符相同

* 如果字符串为null,返回false

* 如果给定的位置大于字符串长度,返回false

* 如果给定的位置小于0,返回false * * @param str 字符串 * @param position 位置 * @param c 需要对比的字符 * @return 字符串指定位置的字符是否与给定字符相同 * @since 3.3.1 */ fun CharSequence?.equalsCharAt(position: Int, c: Char): Boolean { return StrUtil.equalsCharAt(this ?: "", position, c) } /** * 给定字符串数组的总长度

* null字符长度定义为0 * * @param strs 字符串数组 * @return 总长度 * @since 4.0.1 */ fun Collection.totalLength(): Int { return StrUtil.totalLength(*this.toTypedArray()) } /** * 循环位移指定位置的字符串为指定距离

* 当moveLength大于0向右位移,小于0向左位移,0不位移

* 当moveLength大于字符串长度时采取循环位移策略,即位移到头后从头(尾)位移,例如长度为10,位移13则表示位移3 * * @param str 字符串 * @param startInclude 起始位置(包括) * @param endExclude 结束位置(不包括) * @param moveLength 移动距离,负数表示左移,正数为右移 * @return 位移后的字符串 * @since 4.0.7 */ fun CharSequence?.move(startInclude: Int, endExclude: Int, moveLength: Int): String { return StrUtil.move(this ?: "", startInclude, endExclude, moveLength) } /** * 生成随机UUID * * @return UUID字符串 * @see IdUtil.randomUUID * @since 4.0.10 */ fun uuid(): String { return StrUtil.uuid() } /** * 给定字符串中的字母是否全部为大写,判断依据如下: * *
 * 1. 大写字母包括A-Z
 * 2. 其它非字母的Unicode符都算作大写
* * * @param str 被检查的字符串 * @return 是否全部为大写 * @since 4.2.2 */ fun CharSequence?.isUpperCase(): Boolean { return StrUtil.isUpperCase(this ?: "") } /** * 给定字符串中的字母是否全部为小写,判断依据如下: * *
 * 1. 小写字母包括a-z
 * 2. 其它非字母的Unicode符都算作小写
* * * @param str 被检查的字符串 * @return 是否全部为小写 * @since 4.2.2 */ fun CharSequence?.isLowerCase(): Boolean { return StrUtil.isLowerCase(this ?: "") } /** * 获取字符串的长度,如果为null返回0 * * @param cs a 字符串 * @return 字符串的长度,如果为null返回0 * @since 4.3.2 */ fun CharSequence?.length(): Int { return StrUtil.length(this) } /** * 给定字符串转为bytes后的byte数(byte长度) * * @param cs 字符串 * @param charset 编码 * @return byte长度 * @since 4.5.2 */ fun CharSequence?.byteLength(charset: Charset?): Int { return StrUtil.byteLength(this ?: "", charset ?: Charsets.UTF_8) } /** * 切换给定字符串中的大小写。大写转小写,小写转大写。 * *
 * StrUtil.swapCase(null)                 = null
 * StrUtil.swapCase("")                   = ""
 * StrUtil.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
* * * @param str 字符串 * @return 交换后的字符串 * @since 4.3.2 */ fun String?.swapCase(): String { return StrUtil.swapCase(this ?: "") }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy