Kotlin——关于字符串(String)常用操作汇总

一、字符串查找

字符串查找功能在实际开发中,只会用到几个简单的函数,这里我只说明几个常用的。

1.1、获取第一个元素

val str = "kotlin very good"str.first()   <=>   str[0]   <=>   str.get(0)

其还实现了查找等于某一个字符的第一个元素,即first{}高阶函数

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

还有一个firstOrNull()函数,它和first()函数的区别在于如果字符串为空串时,first()函数会抛出异常,而firstOrNull()函数会返回null。当然还有firstOrNull{}函数,它和first{}函数的区别在于如果字符串为空串时,first{}函数会抛出异常,而firstOrNull{}函数会返回null

1.2、 获取最后一个元素

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{}一样。

1.3、查找元素

其实查找元素提供了两个高阶函数find{}findLast{}。不过他们都是对firstOrNull()lastOrNull()函数进行处理。这里不多作累述。

1.3、 查找对应元素的下标

这里提供查找对应元素下标的几个函数:

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

例:

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"))

输出结果为:

114171412

二、字符串截取

如果你有Java或者其他语言的编程基础。相信您对字符串的截取应该不会陌生。您可以继续的往下看,就当作是对字符串截取只是的一个巩固。当然,您也可以直接的跳过本节内容,因为在Kotlin中,字符串的截取的函数subString()是调用了Java中的subString()函数。

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

2.1、 用subString()函数截取

我们看一看subString()函数的源码

@kotlin.internal.InlineOnlypublic inline fun String.substring(startIndex: Int): String = (this as java.lang.String).substring(startIndex) @kotlin.internal.InlineOnlypublic 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 - 1println(str.substring(0,15))println(str.substring(IntRange(0,15)))

输出结果为:

a very good programming languageKotlin is a verKotlin is a very

注意:

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

2.2、用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 verKotlin is a very

三、字符串替换

同上述字符串截取一样,如果您有编程经验,可跳过此节。不过对于字符串替换功能,Kotlin除了实现Java中的replace()ha函数外,还提供了另外的replaceFirst()replaceAfter()replaceBefore()replaceIndent()、等函数。下面会对这些函数意义进行实例讲解。

3.1、replace()函数

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

3.1.1、 replace(oldChar,newChar,ignoreCase = false)

其中:

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

例:

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

输出结果为:

Kotlin is A very good progrAmming lAnguAge

3.1.2、 replace(oldValue,newValue,ignoreCase = false)

其中:

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

例:

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

输出结果为:

Java is a very good programming language

3.1.3、 replace(regex,replacement)

其中:

  • 作用 : 根据定义的正则规则去匹配源字符串,把满足规则的字符串替换成新的字符串。
  • 参数说明:
  1. regex: 正则表达式
  2. replacement: 新的字符串

例:

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

输出结果为:

kotlina kotlin kotlin kotlin is kotlin

3.1.4、replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence)

其中:

  • 作用 : 根据定义的正则规则去匹配源字符串,把满足规则的字符串通过transform{}高阶函数映射的新字符串替换。
  • 参数说明:
  1. regex: 正则表达式
  2. 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()函数中的参数都有大致的了解。并且下面的几个函数也是大致相同的操作。故而下面的几个函数操作,我只会举例说明其作用。关于参数的介绍就不作细究了

3.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 languageJava is a very good programming language

3.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 languageJavaKotlin is a very good programming language

3.4、replaceBeforeLast()函数

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

例:

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

输出结果为:

AAageJavaKotlin is a very good programming language

3.5、replaceAfter()函数

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

例:

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

输出结果为:

Kotlin is aAAKotlinJava

3.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 languaAAKotlinJava

四、字符串分割

同上一节一样,Kotlin除了实现Java中的split()函数之外,还提供了splitToSequence()函数来分割字符串。分割成功后都会返回一个字符串集合用于我们后续操作。

4.1、 split()函数

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

4.1.2、使用正则表达式分割

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   

4.1.2、使用字符或字符串分割

在实际的项目开发中,还是这种方式用的要多一些。不过这里值得注意的是,不管是用字符分割,还是字符串分割,其都是一个可变参数。即其参数的个数不定。

例:

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     languageKotlin   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 

4.2、 splitToSequence()函数

此函数同样可以用字符串或字符去分割,其用法和上述的split()函数一样。这里就不多累述了...

五、其他

除了上面讲解到的几点外,还有很多常用的处理,比如检测字符串是否为空串,是否为null,获取字符串长度,字符串反转,统计,转换字符数组,获取指定下标的字符等等。

5.1、 获取字符串长度

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

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

实例:

val str = "kotlin very good" // 1\. 直接用length属性获取println("str.length => ${str.length}") // 2\. 用count()函数获取println("str.count() => ${str.count()}")

输出结果为:

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

这里我们看一看count()函数的源码

/** * Returns the length of this char sequence. * 其实也就是返回了length属性... */@kotlin.internal.InlineOnlypublic inline fun CharSequence.count(): Int {    return length}

5.2、统计重复字符

上面讲到了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

5.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())

输出结果为:

falsetruefalsefalsetruefalse

5.4、字符串连接

字符串链接,在Java中只能使用+来链接,当然除了StringBuilder、StringBuffer除外。而在Kotlin中除了使用+以外,还可以使用plus()函数。其接受任意类型。plus()函数是一个运算符重载函数。在前面的章节中讲解过了。若你对Kotlin中的云素福重载不了解,您可以查看我的另一篇文章:Kotlin——从无到有系列之初级篇(五):操作符重载

实例讲解:

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

输出结果为:

kotlin very goodkotlin very good

5.5、字符串反转

和数组一样,字符串也是可以反转元素的。直接使用reversed()函数即可。

例:

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

输出结果:

字符串反转:niltok

5.6、判断字符串的起始与结尾

在实际的开发中,判断字符串的起始与结尾是很常用的。

5.6.1、 startsWith()

其中:

作用: 判断其字符串是否由某一个字符或字符串起始。参数说明:

  1. char : 起始字符
  2. prefix : 起始字符串
  3. ignoreCase : 是否调用Java中的此函数。默认为false
  4. startIndex : 开始位置

例:

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

输出结果为:

truetruetrue

5.6.2、endsWith()

其中:

作用: 判断其字符串是否由某一个字符或字符串结尾。参数说明:

  1. char : 结尾字符
  2. suffix : 结尾字符串
  3. ignoreCase : 是否调用Java中的此函数。默认为false

例:

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

输出结果为:

truetrue

原文链接:https://blog.csdn.net/u013212407/article/details/8095168

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345