文章目录

  • 一、字符串查找
  • 1. 获取第一个元素
  • 2. 获取最后一个元素
  • 3. 查找元素
  • 二、字符串截取
  • 三、字符串替换
  • 1. replace() 函数
  • 2. replaceFirst()
  • 3. replaceBefore()
  • 4. replaceBeforeLast()
  • 5. replaceAfter()
  • 6. replaceAfterLast()
  • 四、字符串分割
  • 1. split()
  • 2. splitToSequence()
  • 五、其他
  • 1. 获取字符串长度
  • 2. 统计重复字符
  • 3. 验证字符串
  • 4. 字符串连接
  • 5. 字符串反转
  • 6. 判断字符串的起始与结尾


实际开发中,关于字符串的使用可谓是随处可见,在这篇文章中,会对字符串(String)的常用操作做出一个讲解。

一、字符串查找

1. 获取第一个元素

主要包含 first() | firstOrNull()和first{} | firstOrNull{} 四个函数

  • first() | firstOrNull() 作用 :查找字符串的第一个元素
    区别 :若字符串为空串时,前者会抛出NoSuchElementException异常 ,后者会返回 null

例子:

val str = "kotlin very good"

// 如果字符串为空串时,会抛出NoSuchElementException异常
str.first()   <=>   str[0]   <=>   str.get(0)

// 如果字符串为空串时,会返回null
str.firstOrNull()
  • first{} | firstOrNull{} 作用 :查找等于某一个字符的第一个元素
    区别 :未查找到满足条件的元素,前者会抛出 NoSuchElementException 异常 ,后者会返回null

例子:

val str = "kotlin very good"

// 如果未查找到满足条件的元素,会抛出NoSuchElementException异常
str.first{ it == 'o' } 

// 如果未查找到满足条件的元素,会返回null
str.firstOrNull{ it == 'o' }

2. 获取最后一个元素

主要包含 last() | lastOrNull()last{} | lastOrNull{}四个函数

  • last() | lastOrNull() 作用 :查找字符串的最后一个元素
    区别 :若字符串为空串时,前者会抛出NoSuchElementException异常 ,后者会返回null

例子:

val str = "kotlin very good"

// 如果字符串为空串时,会抛出NoSuchElementException异常
// 其中 lastIndex 是一个拓展属性,其实现是 length - 1
str.last()   <==>   str.get(lastIndex)   <==>  str[lastIndex]

// 如果字符串为空串时,会返回null
str.lastOrNull()
  • last{}和lastOrNull{} 作用 :查找等于某一个字符的最后一个元素
    区别 :未查找到满足条件的元素,前者会抛出 NoSuchElementException 异常 ,后者会返回null

例子:

val str = "kotlin very good"

// 如果未查找到满足条件的元素,会抛出NoSuchElementException异常
// 其实从源码中我们发现其是对原字符串反转之后再进行遍历查找满足条件的元素。这样遍历的次数就减少了
str.last{ it == 'o' } 

// 如果未查找到满足条件的元素,会返回null
str.lastOrNull{ it == 'o' }

3. 查找元素

  • find{} | findLast{} 其实查找元素提供了两个高阶函数find{}、findLast{}。不过其内部都是调用firstOrNull()、lastOrNull()函数进行处理。
  • 查找对应元素的下标

indexOf() : 查找某一个元素或字符串在原字符串中第一次出现的下标。
indexLastOf() :查找某一个元素或字符串在原字符串中最后一次出现的下标。
indexOfFirst{} : 同indexOf()
indexOfLast{} : 同indexLastOf()

例子:

val str = "kotlin very good"

println(str.indexOfFirst { it == 'o' })
println(str.indexOfLast { it == 'o' })
println(str.indexOf('o',0))
println(str.indexOf("very",0))
println(str.lastIndexOf('o'))
println(str.lastIndexOf("good"))

输出结果:

1
14
1
7
14
12

二、字符串截取

在 Kotlin 中除了调用 subString()函数外,还可以调用subSequence()函数,有兴趣的朋友可以去看看源码。

1. 用 subString()函数截取

Kotlin 中是使用了 Java 中的 subString() 函数

  • startIndex参数:截取字符串的开始下标
  • endIndex参数:截取字符串的结束下标
  • rang参数,是指一个IntRang类型,表示一个范围

例子:

val str = "Kotlin is a very good programming language"

println("s = ${str.substring(10)}")  // 当只有开始下标时,结束下标为length - 1
println(str.substring(0,15))
println(str.substring(IntRange(0,15)))

输出结果:

a very good programming language
Kotlin is a ver
Kotlin is a very

注意:

  • 使用subString(startIndex,endIndex)subString(rang)时的区别。可以从上边的结果结合源码可以看出来。
  • 切记下标越界的情况。即StringIndexOutOfBoundsException异常

2. 用 subSequence()函数截取
在 Kotlin 中除了使用上面讲解到的使用 subString() 截取字符串外,还可以使用 subSequence() 函数截取。

例子:

val str = "Kotlin is a very good programming language"

println(str.subSequence(0,15))
println(str.subSequence(IntRange(0,15)))

输出结果:

Kotlin is a ver
Kotlin is a very

三、字符串替换

1. replace() 函数

replace() 函数提供了 4 个重载函数。他们能实现不同的功能

  • replace(oldChar,newChar,ignoreCase = false)
    作用 : 把原字符串中的某一个字符全部替换成新的字符。然后返回新的字符串
  • oldChar: 需要替换的字符
  • newChar: 新的字符
  • ignoreCase : 是否引用Java中的replace()函数。默认值为false,即用Java的replace()函数

例子:

// 把字符`a`全部替换为`A`
val str = "Kotlin is a very good programming language"
println(str.replace('a','A'))

输出结果:

Kotlin is A very good progrAmming lAnguAge

  • replace(oldValue,newValue,ignoreCase = false)
    作用 : 把原字符串中的某一个字符全部替换成新的字符。然后返回新的字符串
  • oldValue: 需要替换的字符串
  • newValue: 新的字符串
  • ignoreCase : 是否引用Java中的replace()函数。默认值为false,即用Java的replace()函数

例子:

// 把字符串`Kotlin`替换成字符串`Java`
val str = "Kotlin is a very good programming language"
println(str.replace("Kotlin","Java"))

输出结果:

Java is a very good programming language

  • replace(regex,replacement)
    作用 : 根据定义的正则规则去匹配源字符串,把满足规则的字符串替换成新的字符串。
  • regex: 正则表达式
  • replacement: 新的字符串

例子:

// 正则的规则为检测数字,如果为数字则替换成字符串`kotlin`
val str = "1234a kotlin 5678 3 is 4"
println(str.replace(Regex("[0-9]+"),"kotlin"))

输出结果:

kotlina kotlin kotlin kotlin is kotlin

  • replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence)
    作用 : 根据定义的正则规则去匹配源字符串,把满足规则的字符串通过transform{}高阶函数映射的新字符串替换。
  • regex: 正则表达式
  • transform: 高阶函数

例子:

val str = "1234a kotlin 5678 3 is 4"
val newStr = str.replace(Regex("[0-9]+"),{"abcd "})

输出结果:

abcd abcd abcd abcd a kotlin abcd abcd abcd abcd abcd is abcd

2. replaceFirst()

作用:把满足条件的第一个字符或字符串替换成新的字符或字符串

例子:

val str = "Kotlin is a very good programming language"
println(str.replaceFirst('a','A'))
println(str.replaceFirst( "Kotlin","Java"))

输出结果:

Kotlin is A very good programming language
Java is a very good programming language

3. replaceBefore()

作用:截取满足条件的第一个字符或字符串后面的字符串,包含满足条件字符或字符串自身,并在其前面加上新的字符串。

例子:

val str = "Kotlin is a very good programming language"
println(str.replaceBefore('a',"AA"))
println(str.replaceBefore("Kotlin","Java"))

输出结果:

AAa very good programming language
JavaKotlin is a very good programming language

4. replaceBeforeLast()

作用:截取满足条件的最后一个字符或字符串后面的字符串,包含满足条件字符或字符串自身,并在其前面加上新的字符串。

例子:

val str = "Kotlin is a very good programming language"
println(str.replaceBeforeLast('a',"AA"))
println(str.replaceBeforeLast("Kotlin","Java"))

输出结果:

AAage
JavaKotlin is a very good programming language

5. replaceAfter()

作用:截取满足条件的第一个字符或字符串前面的字符串,包含满足条件字符或字符串自身,并在其后面加上新的字符串。

例子:

val str = "Kotlin is a very good programming language"
println(str.replaceAfter('a',"AA"))
println(str.replaceAfter("Kotlin","Java"))

输出结果:

Kotlin is aAA
KotlinJava

6. replaceAfterLast()

作用:截取满足条件的最后一个字符或字符串前面的字符串,包含满足条件字符或字符串自身,并在其后面加上新的字符串。

例子:

val str = "Kotlin is a very good programming language"
println(str.replaceAfterLast('a',"AA"))
println(str.replaceAfterLast("Kotlin","Java"))

输出结果:

Kotlin is a very good programming languaAA
KotlinJava

四、字符串分割

Kotlin 除了实现 Java 中的 split() 函数之外,还提供了 splitToSequence() 函数来分割字符串。

1. split()

split() 函数也是提供了4个重载函数。其中,用正则表达式为条件分割占用两个。用字符分割占用一个。用字符串分割占用一个。

  • 使用正则表达式分割
    在 Kotlin 中使用正则表达式,使用的是 Regex 类,而 Java 中使用正则表达式使用的 Pattern 类。
var str2 = "1 kotlin 2 java 3 Lua 4 JavaScript"

val list3 = str2.split(Regex("[0-9]+"))
for (str in list3){
    print("$str \t")
}

println()

val list4 = str2.split(Pattern.compile("[0-9]+"))
for (str in list4){
    print("$str \t")
}

输出结果:

kotlin java Lua JavaScript
kotlin java Lua JavaScript

  • 使用字符或字符串分割
    在实际的项目开发中,还是这种方式用的要多一些。不过这里值得注意的是,不管是用字符分割,还是字符串分割,其都是一个可变参数。
val str1 = "Kotlin is a very good programming language"

val list1 = str1.split(' ')
for (str in list1){
    print("$str \t")
}

println()

val list2 = str1.split(" ")
for (str in list2){
    print("$str \t")
}

输出结果:

Kotlin is a very good programming language Kotlin
is a very good programming language

例子:

val str3 = "a b c d e f g h 2+3+4+5"
val list5 = str3.split(' ','+')
for (str in list5){
    print("$str \t")
}

输出结果:

a b c d e f g h 2 3 4 5

2. splitToSequence()

此函数同样可以用字符串或字符去分割,其用法和上述的 split() 函数一样。

五、其他

1. 获取字符串长度

在 Kotlin 中用两种获取字符串长度的方法。其实也是一种而已

  • 直接用length属性获取长度
  • 用count()函数获取,其实count()函数的做法也是返回了length长度。

例子:

val str = "kotlin very good"

// 1. 直接用length属性获取
println("str.length => ${str.length}")

// 2. 用count()函数获取
println("str.count() => ${str.count()}")

输出结果:

str.length => 16
str.count() => 16

2. 统计重复字符

count{}的高阶函数

/*
  count{}函数源码  
  该函数接受一个`Boolean`类型的`Lambda`表达式。然后循环这个字符串,如果我的条件成立,则变量`count`自增。
  循环完成之后返回重复的个数`count`
 */
 public inline fun CharSequence.count(predicate: (Char) -> Boolean): Int {    
 	var count = 0    
 	for (element in this) if (predicate(element)) count++    
 	return count
 }

例子:

val str = "kotlin very good"
val count = str.count { it == 'o' }
println("count : $count")

输出结果:

count : 3

3. 验证字符串

下列几个函数都是处理字符串为空串或为空的:

  • isEmpty() : 其源码是判断其length是等于0,若等于0则返回true,反之返回false。不能直接用于可空的字符串
  • isNotEmpty() : 其源码是判断其length是否大于0,若大于0则返回true,反之返回false。不能直接用于可空的字符串
  • isNullOrEmpty() : 其源码是判断该字符串是否为null或者其length是否等于0。
  • isBlank() : 其源码是判断其length是否等于0,或者判断其包含的空格数是否等于当前的length。不能直接用于可空的字符串
  • isNotBlank() : 其源码是对isBlank()函数取反。不能直接用于可空的字符串
  • isNotOrBlank() : 其源码判断该字符串是否为null。或者调用isBlank()函数

例子:

val str : String? = "kotlin"

/* 
  可以看出当str为可空变量的时候,isNullOrEmpty()和isNotOrBlank()可以不做直接调用而不做任何处理
  ,而其他的函数则不行
 */
 str?.isEmpty()            //false
str?.isNotEmpty()         // true
str.isNullOrEmpty()       //false
str?.isBlank()            //false
str?.isNotBlank()         //true
str.isNullOrBlank()       //false

4. 字符串连接

例子:

val oldStr = "kotlin"
println(oldStr.plus(" very good"))
println(oldStr + " very good")

输出结果:

kotlin very good
kotlin very good

5. 字符串反转

例子:

val str = "kotlin"
println("字符串反转:${str.reversed()}")

输出结果:

字符串反转:niltok

6. 判断字符串的起始与结尾

  • startsWith()
    例子:
val str = "kotlin"
println(str.startsWith('k'))         // 是否有字符`k`起始
println(str.startsWith("Kot"))       // 是否由字符串`kot`起始
println(str.startsWith("lin",3))     // 当起始位置为3时,是否由字符串`lin`起始

输出结果:

true
true
true

  • endsWith()
    例子:
val str = "kotlin"
println(str.endsWith("lin"))  // 是否由字符串`lin`结尾
println(str.endsWith('n'))    // 是否由字符`n`结尾

输出结果:

true
true