介绍
在学习了Kotlin 中String 的基础配置之后,今天主要介绍String的进阶使用。
如何进行String的查找比较和截取。
Kotlin 基础-String类型了解字符串的两种转换,和拼接逻辑 (zinyan.com)
1.字符串查找
在一串String数据中,查找某个字符或者词语是一个比较常见的操作。Kotlin中针对这个需求提供了indexOf
和lastIndexOf
函数,用于查找操作。
1.1 indexOf函数
indexOf
函数是从前往后查找字符(从左往右)。返回第一个字符所在位置的下标。如果没有则返回-1
根据查找对象的不同有两种情况:1.需要查找一个字符,2.需要查找一个字符串。
示例:查找字符。
fun main(string: Array<String>) {
var s:String ="Z同学"
println(s.indexOf('同',0,false))
}
//输出
1
函数介绍:
CharSequence.indexOf(
char: Char, //要查找的字符对象
startIndex: Int = 0, // 从指定的下标开始进行查找,我们如果不传的话默认从0开始
ignoreCase: Boolean = false // 是否忽略大小写进行匹配,默认为false不忽略。如果是中文没有意义
): Int
示例2:查找字符串
fun main(string: Array<String>) {
var s:String ="Z同学"
println(s.indexOf("同学",0,false))
}
//输出
1
他的函数详情和上面是一样的,只是char换成了String对象而已。查找字符串的时候,下标位置就是比对成功的字符串第一个字符在源字符串中的位置下标。
字符串比较的下标都是从0开始,第一个的下标就和数组的下标一样,由0开始计算。
1.2 lastIndexOf 函数
整体的功能和indexOf
函数是一样的,只是它是从后面往前面进行比较。所以我们一样可以通过字符和字符串进行比较查询。查询指定String对象的位置下标。
在这里插一个小知识点,有些语言是从右往左的,例如蒙文,维文等。那么lastIndexOf就会从左往右计算。而indexOf就会从右往左计算并判断。
示例:
fun main(string: Array<String>) {
var s:String ="Z同学,Y同学"
println(s.lastIndexOf("同学"))
}
//输出 5
我们在使用lastIndexOf 的时候除了startIndex 不一样,其他的都一样的
CharSequence.lastIndexOf(
string: String, // 要查找的字符串,我们也可以传char对象。
startIndex: Int = lastIndex, // 指定查找开始的位置,默认情况为String的最后一个字符的下标开始
ignoreCase: Boolean = false // 是否忽略大小写,进行匹配。默认为false 不忽略大小写
): Int
ignoreCase
: 在比较的时候,默认是false。是进行区分大小写比较。我们如果想关闭大小写区分那么需要传true。
我们在lastIndexOf 比较的时候如果传的startIndex 长度超过String的整体长度会不会出现下标越界呢?
在java中可能我们经常会碰见这种比较的时候出现下标越界的情况。在Kotlin的String比较中。该参数输入超过了字符长度也不影响。也能够正常使用
示例:
fun main(string: Array<String>) {
var s:String ="Z同学,Y同学"
println(s.lastIndexOf("同学",s.length+122,false))
}
//输出
5
2. 字符串比较
我们通常比较String 的时候,会比较两个字符串是否相等,比较字符串前缀是否匹配,后缀是否匹配。
(如果要比较是否存在某个字符串,我们通过字符串查找就能进行判断了。)
2.1 比较字符串是否相等== ,!=
比较相等, 在Kotlin中我们可以直接使用== 或者!= 进行比较。而这两个运算符在底层实际上还是调用了.equals函数进行比较。所以我们可以直接使用这两个符号进行比较两个字符串是否相等,或者是否不相等
示例:
fun main(string: Array<String>) {
var s = "zinyan.com"
var zz = "z同学"
println(s==zz) //输出 false
println(s!=zz) //输出 true
}
这个时候小伙伴就要问了,如果其中有个对象是空的会怎么样? 例如上面的s 对象是个空的
示例:
fun main(string: Array<String>) {
var s :String ?= null
var zz = "z同学"
println(s==zz) //输出 false
println(s!=zz) //输出 true
}
没有任何影响,不会出现崩溃异常。我们可以放心使用。
2.2 比较大小 compartTo
这种情况比较少见,就是比较两个字符串的大小是否相同。它将会按照字典顺序比较两个字符串,如果当前字符串等于比较字符串返回0,如果当前字符串位于比较字符串前面,返回小于的数值,如果当前字符串位于比较字符串后面,返回大于0的值。
示例:
fun main(string: Array<String>) {
var s :String ="zinyan"
var zz = "zinyan"
println(s.compareTo(zz)) //返回0
}
我们如果修改下字母的大小写
示例2:
fun main(string: Array<String>) {
var s :String ="zinyan"
var zz = "Zinyan"
println(s.compareTo(zz)) //输出 32
}
为什么会是32呢? 因为z在字典上的值是:90。而Z在字典上的值是:32 比较后 返回的就是32了
而如果我们将s 和zz 的数据进行替换后,返回的结果就是-32了
示例3:
fun main(string: Array<String>) {
var s :String ="Zinyan"
var zz = "zinyan"
println(s.compareTo(zz)) //输出 -32
}
这种比较在我的实际工作中。很少碰见,我也不知道这个比较的意义是有什么用?
也许这种比较更安全?如果有明白的小伙伴,欢迎给我留言解惑
2.3 比较字符串前缀或后缀, startsWith 和endsWith
例如比较url的协议啊,比较文档的名称是否有指定后缀啊,用这个比价会更方便和快捷。
相同的在java中也有类似的函数进行字符串前缀和后缀的比较。
startsWith
: 比较字符串是否以指定的前缀开始的。
endsWith
: 比较字符串是否以指定的后缀结尾的。
示例:
fun main(string: Array<String>) {
var s :String ="zinyan.com"
println(s.endsWith("com")) //输出 true
println(s.startsWith("https")) //输出 false
}
上面是简单写法,不区分大小写。我们如果要进行大小写区分可以传相关参数。
String.startsWith(
prefix: String,
ignoreCase: Boolean = false //默认是区分大小写状态,我们如果希望不区分大小写传true就可以了
): Boolean
3. 字符串截取 substring
在Kotlin中字符串截取是通过substring函数来实现的。
先介绍基本的几个参数使用吧:
//按照区间截取
String.substring(range: IntRange): String
//按照指定索引截取,从0截取到 endIndex-1 的位置 。默认可以省略endIndex 就会从指定位置截取到最后一个字符
String.substring(startIndex: Int, endIndex: Int): String
示例:
fun main(string: Array<String>) {
var s :String ="zinyan.com"
println(s.substring(1,2)) //输出 i
println(s.substring(1..4)) //输出 inya
}
上面是按照下标出现的,还支持按照字符截取的。
例如截取指定字符后面的,或者截取指定字符前面的。
示例:
fun main(string: Array<String>) {
var s :String ="zinyan.com"
println(s.substringAfter("zin")) //输出 yan.com
println(s.substringBefore("yan")) //输出 zin
}
如果我们要截取的作为比较的字符串,前面或者后面有多个的情况。
示例: 截取某个重复出现的字符的最后一次出现后的结果
fun main(string: Array<String>) {
var s :String ="zinyan.com,zinyan"
println(s.substringAfterLast("zin")) //输出 yan
}
substringBeforeLast 的方法也是大同小异的。我就不重复了。
到这里,Kotlin String 对象是不是又学到了一点呢。
评论区