在前面讲解Kotlin
数据类型的时候,提到了字符串类型,固然关于其定义在前面的章节中已经讲解过了。对Kotlin
中的数据类型不清楚的同窗。请参考Kotlin——初级篇(三):数据类型详解这篇文章。
在这篇文章中,会对字符串(String
)的经常使用操做作出一个讲解。好比,字符串的截取、查找、获取长度、替换等等...html
字符串查找功能在实际开发中,只会用到几个简单的函数,这里我只说明几个经常使用的。java
val str = "kotlin very good" str.first() <=> str[0] <=> str.get(0)
其还实现了查找等于某一个字符的第一个元素,即first{}
高阶函数git
val str = "kotlin very good" // 若是未查找到知足条件的元素,会抛出NoSuchElementException异常 str.first{ it == 'o' }
还有一个firstOrNull()
函数,它和first()
函数的区别在于若是字符串为空串时,first()
函数会抛出异常,而firstOrNull()
函数会返回null
。固然还有firstOrNull{}
函数,它和first{}
函数的区别在于若是字符串为空串时,first{}
函数会抛出异常,而firstOrNull{}
函数会返回null
github
val str = ... str.last() <==> str.get(lastIndex) <==> str[lastIndex] 其中 lastIndex 是一个拓展属性,其实现是 length - 1
同时还实现了查找等于某一个字符的最后一个元素,即last{}
高阶函数正则表达式
val str = "kotlin very good" // 若是未查找到知足条件的元素,会抛出NoSuchElementException异常 str.last{ it == 'o' } // 其实从源码中咱们发现其是对原字符串反转以后再进行遍历查找知足条件的元素。
lastOrNull()
同firstOrNUll()
同样。lastOrNull{}
同firstOrNUll{}
同样。编程
其实查找元素提供了两个高阶函数find{}
、findLast{}
。不过他们都是对firstOrNull()
或lastOrNull()
函数进行处理。这里很少做累述。数组
这里提供查找对应元素下标的几个函数:函数
indexOf()
: 查找某一个元素或字符串在原字符串中第一次出现的下标。indexLastOf()
: 查找某一个元素或字符串在原字符串中最后一次出现的下标。indexOfFirst{}
: 同indexOf()
indexOfLast{}
: 同indexLastOf()
例:post
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"))
输出结果为:ui
1 14 1 7 14 12
若是你有Java
或者其余语言的编程基础。相信您对字符串的截取应该不会陌生。您能够继续的往下看,就看成是对字符串截取只是的一个巩固。固然,您也能够直接的跳过本节内容,由于在Kotlin
中,字符串的截取的函数subString()
是调用了Java
中的subString()
函数。
在Kotlin
中除了调用subString()
函数外,还能够调用subSequence()
函数,有兴趣的朋友能够去看看源码。
subString()
函数截取咱们看一看subString()
函数的源码
@kotlin.internal.InlineOnly public inline fun String.substring(startIndex: Int): String = (this as java.lang.String).substring(startIndex) @kotlin.internal.InlineOnly public inline fun String.substring(startIndex: Int, endIndex: Int): String = (this as java.lang.String).substring(startIndex, endIndex) public fun String.substring(range: IntRange): String = substring(range.start, range.endInclusive + 1)
从以上的源码中咱们能够看出,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
异常subSequence()
函数截取在Kotlin
中除了使用上面讲解到的使用subString()
截取字符串外,还可使用subSequence()
函数截取。
咱们看一看其源码实现:
public fun subSequence(startIndex: Int, endIndex: Int): CharSequence public fun CharSequence.subSequence(range: IntRange): CharSequence = subSequence(range.start, range.endInclusive + 1)
从源码中咱们能够看出,其大体和subString()
函数同样,可是其不提供只传递startIndex
的状况
实例:
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
同上述字符串截取同样,若是您有编程经验,可跳过此节。不过对于字符串替换功能,Kotlin
除了实现Java
中的replace()
ha函数外,还提供了另外的replaceFirst()
、replaceAfter()
、replaceBefore()
、replaceIndent()
、等函数。下面会对这些函数意义进行实例讲解。
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
能够从上述的两个函数中看到两个函数的区别。关于高阶函数
、正则表达式
的知识点能够先自行看资料理解。小生会在后续的章节中补上相关的内容...
通过上面的replace()
函数的讲解。而且对几个重载函数进行了分析。相信你们对replace()
函数中的参数都有大体的了解。而且下面的几个函数也是大体相同的操做。故而下面的几个函数操做,我只会举例说明其做用。关于参数的介绍就不做细究了
做用:把知足条件的第一个字符或字符串替换成新的字符或字符串
例:
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
做用:截取知足条件的第一个字符或字符串后面的字符串,包含知足条件字符或字符串自身,并在其前面加上新的字符串。
例:
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
做用:截取知足条件的最后一个字符或字符串后面的字符串,包含知足条件字符或字符串自身,并在其前面加上新的字符串。
例:
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
做用:截取知足条件的第一个字符或字符串前面的字符串,包含知足条件字符或字符串自身,并在其后面加上新的字符串。
例:
val str = "Kotlin is a very good programming language" println(str.replaceAfter('a',"AA")) println(str.replaceAfter("Kotlin","Java"))
输出结果为:
Kotlin is aAA KotlinJava
做用:截取知足条件的最后一个字符或字符串前面的字符串,包含知足条件字符或字符串自身,并在其后面加上新的字符串。
例:
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()
函数来分割字符串。分割成功后都会返回一个字符串集合用于咱们后续操做。
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
此函数一样能够用字符串或字符去分割,其用法和上述的split()
函数同样。这里就很少累述了...
除了上面讲解到的几点外,还有不少经常使用的处理,好比检测字符串是否为空串,是否为null
,获取字符串长度,字符串反转,统计,转换字符数组,获取指定下标的字符等等。
在
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
这里咱们看一看count()
函数的源码
/** * Returns the length of this char sequence. * 其实也就是返回了length属性... */ @kotlin.internal.InlineOnly public inline fun CharSequence.count(): Int { return length }
上面讲到了count()
函数,是返回了length
属性获取字符串的长度。其实源码中还提供了一个叫count{}
的高阶函数,用于统计字符串中重复某个字符的个数。
看一看他的源码
public inline fun CharSequence.count(predicate: (Char) -> Boolean): Int { var count = 0 for (element in this) if (predicate(element)) count++ return count }
源码解释:该函数接受一个Boolean
类型的Lambda
表达式。而后循环这个字符串,若是个人条件成立,则变量count
自增。循环完成以后返回重复的个数count
实例:
val str = "kotlin very good" val count = str.count { it == 'o' } println("count : $count")
输出结果为:
count : 3
在实际的开发中,特别是Android
开发中,会常常遇到验证输入框的内容是否为空串的时候。在Kotlin
中,和Java
同样提供了几个处理这种状况的函数。
下列几个函数都是处理字符串为空串或为空的:
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()能够不作直接调用而不作任何处理 ,而其余的函数则不行 println(str?.isEmpty()) println(str?.isNotEmpty()) println(str.isNullOrEmpty()) println(str?.isBlank()) println(str?.isNotBlank()) println(str.isNullOrBlank())
输出结果为:
false true false false true false
字符串连接,在Java
中只能使用+
来连接,固然除了StringBuilder、StringBuffer
除外。而在Kotlin
中除了使用+
之外,还可使用plus()
函数。其接受任意类型。plus()
函数是一个运算符重载函数。在前面的章节中讲解过了。若你对Kotlin
中的云素福重载不了解,您能够查看个人另外一篇文章:Kotlin——初级篇(五):操做符与操做符重载一
实例讲解:
val oldStr = "kotlin" println(oldStr.plus(" very good")) println(oldStr + " very good")
输出结果为:
kotlin very good kotlin very good
和数组同样,字符串也是能够反转元素的。直接使用reversed()
函数便可。
例:
val str = "kotlin" println("字符串反转:${str.reversed()}")
输出结果:
字符串反转:niltok
在实际的开发中,判断字符串的起始与结尾是很经常使用的。
其中:
做用: 判断其字符串是否由某一个字符或字符串起始。
参数说明:
char
: 起始字符prefix
: 起始字符串ignoreCase
: 是否调用Java
中的此函数。默认为false
startIndex
: 开始位置
例:
val str = "kotlin" str.startsWith('k') // 是否有字符`k`起始 str.startsWith("Kot") // 是否由字符串`kot`起始 str.startsWith("lin",3) // 当起始位置为3时,是否由字符串`lin`起始
输出结果为:
true true true
其中:
做用: 判断其字符串是否由某一个字符或字符串结尾。
参数说明:
char
: 结尾字符suffix
: 结尾字符串ignoreCase
: 是否调用Java
中的此函数。默认为false
例:
val str = "kotlin" println(str.endsWith("lin")) // 是否由字符串`lin`结尾 println(str.endsWith('n')) // 是否由字符`n`结尾
输出结果为:
true true
在实际的项目开发中,字符串的处理使用的状况是不少的。特别是字符串的验证处理、替换、分割、截取。这也是我把这些知识点整理出来的缘由。这些知识点是很基础,但同时也是很经常使用的。若是您有编程经验的话您就当对字符串的基础知识的巩固。
关于kotlin
中字符串的操做就写到这里,其实还有不少功能,虽然在开发中用到的地方不是特别多,可是咱们最起码能应该有个了解。有兴趣的朋友能够去看看其源码的实现。
若是各位大佬看了以后感受还阔以,就请各位大佬随便star
一下,您的关注是我最大的动力。
个人我的博客:Jetictors
Github:Jteictors
掘金:Jteictors