一、字符串
1.1、字符串查找
查找第一个元素
//1、使用【index】或get(index)获取元素,查找第一个元素
println(a[0])//H
println(a.get(100))//数组越界则抛出StringIndexOutOfBoundsException异常
//2、使用 first/firstOrNull 查找第一个元素
println(a.first())//H first查找第一个元素,如果字符串为空,则抛出NoSuchElementException异常
println(a.firstOrNull())//H firstOrNull查找第一个元素,如果字符串为空,不会抛出异常,返回null
println("".firstOrNull())//null
//3、使用 first{}/firstOrNull{} 查找
println(a.first { it =='H'})//H first{}函数查找第一个元素,如果字符串为空,则抛出NoSuchElementException异常
println(a.firstOrNull { it =='H'})//H firstOrNull{}函数查找第一个元素 ,如果字符串为空,不会抛出异常,返回null
println("".firstOrNull { it =='H'})//null
查找最后一个元素
val a = "Hello Kotlin"
println(a.get(a.length-1))//n //使用get(index)查找最后一个元素
println(a[a.length-1])//n //使用【index】查找最后一个元素
println(a.last())//n //使用last()查找最后一个元素,注意:如果字符串为null则抛出NoSuchElementException异常
println(a.lastOrNull())//n //使用lastOrNull()查找最后一个元素 ,如果字符串为空,不会抛出异常,返回null
println("".lastOrNull())//null
查找元素
查找元素提供了两个高阶函数find{}
、findLast{}
。
val a = "Hello Kotlin"
println(a.find { it=='H' })//H 从前往后查找第一个H 字符串为null 返回null ,对firstOrNull()处理
println(a.findLast { it=='H' })//H 从后往前查找第一个H 字符串为null 返回null 对lastOrNull()处理
查找对应元素的下标
这里提供查找对应元素下标(每找到返回-1)的几个函数:
indexOf()
: 查找某一个元素或字符串在原字符串中第一次出现的下标。lastIndexOf()
: 查找某一个元素或字符串在原字符串中最后一次出现的下标。indexOfFirst{}
: 同indexOf()
indexOfLast{}
: 同indexLastOf()
val a = "Hello Kotlin"
println(a.indexOf('o',0))//4 从第0位置开始查找
println(a.indexOf("Kotlin",1))//6 从第1位置开始查找
println(a.indexOfFirst { it == 'o' })//4
println(a.indexOfLast { it == 'o' })//7
println(a.lastIndexOf('o'))//7
println(a.lastIndexOf("llo"))//2
是否包含子字符串
println(a.contains("ll"))//true 是否包含子字符
println(a.contains("LL", true))//true 是否包含子字符 参数2:是否忽略大小写
1.2、字符串截取
subString()函数
Kotlin
中是使用了Java
中的subString()
函数
expect fun String.substring(startIndex: Int): String
expect fun String.substring(startIndex: Int, endIndex: Int): String
fun String.substring(range: IntRange): String
使用如下:
val a = "Hello Kotlin"
println(a.substring(0,4))//Hell 从第0位置截取到第4位置 4不包含
println(a.substring(4))//o Kotlin 从第4位置截取到结尾 4 包含
println(a.substring(IntRange(0,4)))//Hello 从第0位置截取到第4位置 4包含 调用的源码是substring(range.start, range.endInclusive + 1)
substringAfter()函数
在第一次出现分隔符后返回子字符串。如果字符串不包含分隔符,则返回missingDelimiterValue,默认为原始字符串。
fun String.substringAfter(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringAfter(delimiter: String, missingDelimiterValue: String = this): String
使用如下:
println(a.substringAfter("l"))//lo Kotlin 截取第一次出现指定字符(不包括该字符)之后字符串 默认未找到返回原字符串
println(a.substringAfter("KKKK","ERROR"))//ERROR 截取第一次出现指定字符(不包括该字符)之后字符串 未找到返回指定字符串
substringAfterLast()函数
在最后一次出现分隔符后返回一个子字符串。如果字符串不包含分隔符,则返回missingDelimiterValue,默认为原始字符串。
fun String.substringAfterLast(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringAfterLast(delimiter: String, missingDelimiterValue: String = this): String
使用如下:
println(a.substringAfterLast("l"))//in 截取最后一次出现指定字符(不包括该字符)之后字符串 默认未找到返回原字符串
println(a.substringAfterLast("KKKK","ERROR"))//ERROR 截取最后一次出现指定字符(不包括该字符)之后字符串 未找到返回指定字符串
substringBefore()函数
在第一次出现分隔符之前返回一个子字符串。如果字符串不包含分隔符,则返回missingDelimiterValue,默认为原始字符串。
fun String.substringBefore(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringBefore(delimiter: String, missingDelimiterValue: String = this): String
使用如下:
println(a.substringBefore("l"))//He 截取第一次出现指定字符(不包括该字符)之前字符串 默认未找到返回原字符串
println(a.substringBefore("KKKK","ERROR"))//ERROR 截取第一次出现指定字符(不包括该字符)之前字符串 未找到返回指定字符串
substringBeforeLast()函数
在最后一次出现分隔符之前返回一个子字符串。如果字符串不包含分隔符,则返回missingDelimiterValue,默认为原始字符串。
fun String.substringBeforeLast(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringBeforeLast(delimiter: String, missingDelimiterValue: String = this): String
使用如下:
println(a.substringBeforeLast("l"))//Hello Kot 截取最后一次出现指定字符(不包括该字符)之前字符串 默认未找到返回原字符串
println(a.substringBeforeLast("KKKK","ERROR"))//ERROR 截取最后一次出现指定字符(不包括该字符)之前字符串 未找到返回指定字符串
subSequence()函数截取
fun subSequence(startIndex: Int, endIndex: Int): CharSequence
fun CharSequence.subSequence(range: IntRange): CharSequence = subSequence(range.start, range.endInclusive + 1)
从源码中可以看出,其大致和subString()
函数一样,但是没有 只传递startIndex
的函数
使用如下:
val a = "Hello Kotlin"
println(a.subSequence(0,4))//Hell 从第0位置截取到第4位置 4不包含
println(a.subSequence(IntRange(0,4)))//Hello 从第0位置截取到第4位置 4包含 调用的源码是subSequence(range.start, range.endInclusive + 1)
1.3、字符串替换
replace()函数
把原字符串中的某一个字符全部替换成新的字符。然后返回新的字符串
fun String.replace(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String
fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String
inline fun CharSequence.replace(regex: Regex, replacement: String): String = regex.replace(this, replacement)
inline fun CharSequence.replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence): String =
regex.replace(this, transform)
使用如下:
val a = "1Hello 2 Kotlin"
println(a.replace('o','8'))//1Hell8 2 K8tlin 将所有的o替换为8 不忽略大小写
println(a.replace('O','8',true))//1Hell8 2 K8tlin 将所有的o替换为8 忽略大小写
println(a.replace("Kotlin","Java"))//1Hello 2 Java 将所有的Kotlin替换为Java 不忽略大小写
println(a.replace("kotlin","Java",true))//1Hello 1 Java 将所有的kotlin替换为Java 忽略大小写
val r2 = Regex("[0-9]")
println(a.replace(r2,"2018"))//2018Hello 2018 Kotlin 使用正则匹配替换【0-9】为2018
println(a.replace(r2){
if(it.value=="2"){
"A"
}else{
"B"
}
})//BHello A Kotlin 使用正则匹配替换【0-9】如果是2替换为A其他替换为B
replaceFirst()函数
把满足条件的第一个字符或字符串替换成新的字符或字符串
fun String.replaceFirst(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String
fun String.replaceFirst(oldValue: String, newValue: String, ignoreCase: Boolean = false): String
inline fun CharSequence.replaceFirst(regex: Regex, replacement: String): String = regex.replaceFirst(this, replacement)
使用如下:
val a="Hello Kotlin"
println(a.replaceFirst('o','8'))//Hell8 Kotlin 将首个的o替换为8 不忽略大小写
println(a.replaceFirst('O','8',true))//Hell8 Kotlin 将首个的o替换为8 忽略大小写
println(a.replaceFirst("Kotlin","Java"))//Hello Java 将首个的Kotlin替换为Java 不忽略大小写
println(a.replaceFirst("kotlin","Java",true))//Hello Java 将首个的kotlin替换为Java 忽略大小写
println(a.replaceFirst(Regex("[a-z]"),"8"))//H8llo Kotlin 将首个符合正则[a-z]替换为8 不忽略大小写
println(a.replaceFirst(Regex("[a-z]",RegexOption.IGNORE_CASE),"8"))//8ello Kotlin 将首个符合正则[a-z]替换为8 忽略大小写
replaceBefore()函数
截取满足条件的第一个字符或字符串后面的字符串,包含满足条件字符或字符串自身,并在其前面加上新的字符串。
fun String.replaceBefore(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
fun String.replaceBefore(delimiter: String, replacement: String, missingDelimiterValue: String = this): String
使用如下:
val a="Hello Kotlin"
println(a.replaceBefore('l',"4"))//4llo Kotlin 截取首个满足条件的字符或字符串 包括本身,截取到结尾。在截取后字符串前面加上新字符
println(a.replaceBefore("ll","4"))//4llo Kotlin 截取首个满足条件的字符或字符串 包括本身,截取到结尾。在截取后字符串前面加上新字符
replaceBeforeLast()函数
截取满足条件的最后一个字符或字符串后面的字符串,包含满足条件字符或字符串自身,并在其前面加上新的字符串。
fun String.replaceBeforeLast(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
fun String.replaceBeforeLast(delimiter: String, replacement: String, missingDelimiterValue: String = this): String
使用如下:
val a="Hello Kotlin"
println(a.replaceBeforeLast('l',"4"))//4lin 截取最后满足条件的字符或字符串 包括本身,截取到结尾。在截取后字符串前面加上新字符
println(a.replaceBeforeLast("ll","4"))//4llo Kotlin 截取最后满足条件的字符或字符串 包括本身,截取到结尾。在截取后字符串前面加上新字符
replaceAfter()函数
截取满足条件的第一个字符或字符串前面的字符串,包含满足条件字符或字符串自身,并在其后面加上新的字符串。
fun String.replaceAfter(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
fun String.replaceAfter(delimiter: String, replacement: String, missingDelimiterValue: String = this): String
使用如下:
val a="Hello Kotlin"
println(a.replaceAfter('l',"4"))//Hel4 从开始位置截取到首个满足条件字符或字符串,包括本身,在截取后字符串后面加上新字符
println(a.replaceAfter("ll","4"))//Hell4 从开始位置截取到首个满足条件字符或字符串,包括本身,在截取后字符串后面加上新字符
replaceAfterLast()函数
截取满足条件的最后一个字符或字符串前面的字符串,包含满足条件字符或字符串自身,并在其后面加上新的字符串。
fun String.replaceAfterLast(delimiter: String, replacement: String, missingDelimiterValue: String = this): String
fun String.replaceAfterLast(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
使用如下:
val a="Hello Kotlin"
println(a.replaceAfterLast('l',"4"))//Hello Kotl4 从开始位置截取到最后满足条件字符或字符串,包括本身,在截取后字符串后面加上新字符
println(a.replaceAfterLast("ll","4"))//Hell4 从开始位置截取到最后满足条件字符或字符串,包括本身,在截取后字符串后面加上新字符
1.4、字符串分割
split()函数
fun CharSequence.split(vararg delimiters: Char, ignoreCase: Boolean = false, limit: Int = 0): List<String>
fun CharSequence.split(vararg delimiters: String, ignoreCase: Boolean = false, limit: Int = 0): List<String>
inline fun CharSequence.split(regex: Regex, limit: Int = 0): List<String>
fun CharSequence.split(regex: Pattern, limit: Int = 0): List<String>
使用方式:
val a="H1e2l13l41o"
println(a.split('e'))//[H1, 2l13l41o] 以e分割,默认不忽略大小写
println(a.split("E",ignoreCase = true))//[H1, 2l13l41o] 以E分割 ignoreCase = true忽略大小写
println(a.split("L",ignoreCase = true,limit = 2))//[H1e2, 13l41o] 以L分割 ignoreCase = true 忽略大小写,limit = 2 最大返回分割后数据为2
println(a.split("e","4",ignoreCase = true,limit = 10))//[H1, 2l13l, 1o] 以e、4分割 ignoreCase = true 忽略大小写,limit = 2 最大返回分割后数据为10
println(a.split(Regex("[0-9]")))//[H, e, l, , l, , o] 使用正则"[0-9]"分割,可指定分割后数据个数
println(a.split(Regex("[A-Z]",RegexOption.IGNORE_CASE)))//[, 1, 2, 13, 41, ] 使用正则"[0-9]"分割,RegexOption.IGNORE_CASE 忽略大小
println(a.split(Pattern.compile("[A-Z]",Pattern.CASE_INSENSITIVE)))//[, 1, 2, 13, 41, ] java方式使用正则"[0-9]"分割,Pattern.CASE_INSENSITIVE 忽略大小
splitToSequence()函数
fun CharSequence.splitToSequence(vararg delimiters: Char, ignoreCase: Boolean = false, limit: Int = 0): Sequence<String>
fun CharSequence.splitToSequence(vararg delimiters: String, ignoreCase: Boolean = false, limit: Int = 0): Sequence<String>
使用方式:
val a="H1e2l13l41o"
a.splitToSequence('e')//[H1, 2l13l41o] 以e分割,默认不忽略大小写
a.splitToSequence("E",ignoreCase = true)//[H1, 2l13l41o] 以E分割 ignoreCase = true忽略大小写
a.splitToSequence("L",ignoreCase = true,limit = 2)//[H1e2, 13l41o] 以L分割 ignoreCase = true 忽略大小写,limit = 2 最大返回分割后数据为2
a.splitToSequence("e","4",ignoreCase = true,limit = 10)//[H1, 2l13l, 1o] 以e、4分割 ignoreCase = true 忽略大小写,limit = 2 最大返回分割后数据为10
splitToSequence()
与split()
不同于返回值,splitToSequence()
返回Sequence<String>
,而split()
返回List<String>
1.5、字符串的比较
expect fun String?.equals(other: String?, ignoreCase: Boolean = false)
open operator fun equals(other: Any?): Boolean
使用如下:
val a="Hello Kotlin"
val b=String(StringBuffer().append("Hello").append(" Kotlin"))
val c="hello kotlin"
println(a===b)//false === 比较地址
println(a==b)//true == 比较值 与equals相同
println(a.equals(b))//true 比较值
println(a.equals(c,true))//true 比较值 忽略大小写
1.6、字符串其他操作
字符串模板
符串可以包含模板表达式,即可求值的代码片段,并将其结果连接到字符串中
val a="Hello Kotlin"
println("$a 长度为 ${a.length}")//Hello Kotlin 长度为 12
//打印$
println("输出${'$'}")//输出$
获取字符串长度
val a="Hello Kotlin"
println(a.length)//12
println(a.count())//12 count()内部调用的就是length
统计重复字符个数
val a = "Hello Kotlin"
// count{}该函数接受一个Boolean类型的Lambda表达式。然后循环这个字符串,如果我的条件成立,则变量count自增。循环完成之后返回重复的个数count
println(a.count {
it == 'l'
})//3
验证字符串
在Kotlin
中,下列几个函数都是处理字符串为空串或为空的:
isEmpty()
: 判断其length
是否等于0
,若等于0
则返回true
,反之返回false
。不能直接用于可空的字符串isNotEmpty()
:判断其length
是否大于0
,若大于0
则返回true
,反之返回false
。不能直接用于可空的字符串isNullOrEmpty()
: 判断该字符串是否为null
或者其length
是否等于0
,若字符串是否为null
或者其length=0
则返回true
,反之返回false
。isBlank()
: 判断其length
是否等于0
,或者判断其包含的空格数是否等于当前的length
。不能直接用于可空的字符串isNotBlank()
: 是对isBlank()
函数取反。不能直接用于可空的字符串isNotOrBlank()
: 判断该字符串是否为null
。或者调用isBlank()
函数
val a: String? = "Hello Kotlin"
println(a?.isEmpty())//false 判断字符是否为空,需要使用?空安全调用
println(a?.isNotEmpty())//true 判断字符是否为不为空,需要使用?空安全调用
println(a.isNullOrEmpty())//false 判断字符是否为为空,原字符为空返回false,无需空安全调用
println(a?.isBlank())//false 判断字符空格数是否为字符串的长度,需要使用?空安全调用
println(a?.isNotBlank())//true 判断字符空格数是否不为字符串的长度,需要使用?空安全调用
println(a.isNullOrBlank())//false 判断字符空格数是否为字符串的长度,原字符为空返回false,无需空安全调用
字符串连接
val a = "Hello"
println(a+" Kotlin")//Hello Kotlin
println("$a Kotlin")//Hello Kotlin 常用
println(a.plus(" Kotlin"))//Hello Kotlin plus()函数是一个运算符重载函数(+)
字符串反转
和数组一样,字符串也是可以反转元素的,可以调用reversed()
函数
val a = "Hello"
println(a.reversed())//olleH 字符串反转
判断字符串起始
fun CharSequence.startsWith(char: Char, ignoreCase: Boolean = false): Boolean
fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean
fun String.startsWith(prefix: String, startIndex: Int, ignoreCase: Boolean = false): Boolean
fun CharSequence.startsWith(prefix: CharSequence, ignoreCase: Boolean = false): Boolean
fun CharSequence.startsWith(prefix: CharSequence, startIndex: Int, ignoreCase: Boolean = false): Boolean
使用如下:
val a="Hello Kotlin"
println(a.startsWith('H'))//true 判断是否以指定字符开始 默认不忽略大小写
println(a.startsWith("Hello"))//true 判断是否以指定字符串开始 默认不忽略大小写
println(a.startsWith("hello",ignoreCase = true))//true 判断是否以指定字符串开始 ignoreCase = true忽略大小写
println(a.startsWith("llo",2))//true 判断是否以指定字符串从指定位置(2)开始
判断字符串结束
fun String.endsWith(suffix: String, ignoreCase: Boolean = false): Boolean
fun CharSequence.endsWith(char: Char, ignoreCase: Boolean = false): Boolean
fun CharSequence.endsWith(suffix: CharSequence, ignoreCase: Boolean = false): Boolean
val a="Hello Kotlin"
println(a.endsWith('n'))//true 判断是否以指定字符结尾 默认不忽略大小写
println(a.endsWith("in"))//true 判断是否以指定字符串结尾 默认不忽略大小写
println(a.endsWith("IN",true))//true 判断是否以指定字符串结尾 忽略大小写
字符串原样输出
/*---------------------------- 原样输出字符串 ----------------------------*/
val place4="""
12
12
31<html>2</html>
12
32
32 ss
"""
println(place4)
字符串删除空格
inline fun String.trim(): String
inline fun String.trimStart(): String
inline fun String.trimEnd(): String
fun String.trimStart(vararg chars: Char): String
fun String.trimEnd(vararg chars: Char): String
inline fun String.trimStart(predicate: (Char) -> Boolean): String
inline fun String.trimEnd(predicate: (Char) -> Boolean): String
fun String.trimIndent(): String
fun String.trimMargin(marginPrefix: String = "|"): String
使用如下:
val a = " Hello Kotlin "
println(a.trim())//Hello Kotlin 清除首位空格
println(a.trimStart())//Hello Kotlin 清除开始空格
println(a.trimEnd())// Hello Kotlin 清除结束空格
val a1 = "Hello Kotlin"
println(a1.trimEnd('n', 'l', 'i'))//Hello Kot 清除结尾指定字符
println(a1.trimEnd {
it == 'n'||it=='l'||it=='i'
})//Hello Kot 清除结尾指定字符(高阶函数)
println(a1.trimStart('H', 'e'))//llo Kotlin 清除开始指定字符
println(a1.trimStart {
it == 'H' || it == 'e'
})//llo Kotlin 清除开始指定字符(高阶函数)
val b = """
ABC
123
456
"""
println(b.trimIndent())//清除每一行前面的最小缩进
//ABC
//123
//456
val withoutMargin1 = """ABC
|123
|456
"""
println(withoutMargin1.trimMargin())//清除每一行前面的最小缩进和默认'|'字符组合
//ABC
//123
//456
val withoutMargin2 = """
#XYZ
#foo
#bar
"""
println(withoutMargin2.trimMargin("#"))//清除每一行前面的最小缩进和指定字符组合(此处指定"#")
//XYZ
//foo
//bar