【Kotlin 初学者】字符串常用操作汇总(上)

简介: 一、字符串创建1.1 字符串属性1.2 字符串函数二、字符串截取三、字符串分割四、字符串替换

作者简介:CSDN博客专家、华为云享专家认证

系列专栏:Kotlin 初学者

学习交流:三人行必有我师焉;择其善者而从之,其不善者而改之。



一、字符串创建


       String类表示char类型的数组。字符串是不可变的,这意味着长度和元素在创建后不能更改。因为字符串对象是不可变的,所以可以共享它们。


1.fun main() {
    val ch = charArrayOf('S', 'h', 'u', 'a', 'i', 'C', 'i')
    val str = String(ch)
    println(str)//ShuaiCi
}


与Java不同,Kotlin需要使用new关键字来实例化String类的对象。 String可以简单地在双引号("")中声明,称为转义字符串或三引号(""" """),称为原始字符串


fun main() {
    val kotlin = "Kotlin"
    val android = """Android"""
    println("$kotlin-$android")//Kotlin-Android
}


1.1 字符串属性


属性 描述
length: Int 返回字符串序列的长度。
indices: IntRange 返回当前 char 序列中有效字符索引的范围。
lastIndex: Int 返回 char 序列中最后一个字符的索引。


1.2 字符串函数


函数 描述
compareTo(other: String): Int 将当前对象与指定对象进行比较以获得顺序。 如果current等于指定的其他对象,则返回0
get(index: Int): Char 返回当前字符序列中给定索引处的字符。
plus(other: Any?): String 返回连接字符串,其中包含给定其他字符串的字符串表示形式。
subSequence(startIndex: Int,endIndex: Int): CharSequence 从当前字符序列返回从startIndex开始到endIndex新的字符序列
CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false):Boolean 如果字符序列包含指定的字符序列,则返回true
CharSequence.count(): Int 返回char序列的长度。
String.drop(n: Int): String 删除前n个字符后返回一个字符串。
String.dropLast(n: Int): String 删除最后一个n字符后返回一个字符串。
String.dropWhile(predicate: (Char) -> Boolean): String 返回一个包含所有字符的字符序列,但满足给定谓词的第一个字符除外。
CharSequence.elementAt(index: Int): Char 将返回给定索引处的字符,或如果索引在字符序列中不存在,则抛出IndexOutOfBoundsException
CharSequence.indexOf(char: Char, startIndex: Int = 0, ignoreCase: Boolean = false): Int 返回从给定的索引值开始给定字符第一次出现的索引。
CharSequence.indexOfFirst(predicate: (Char) -> Boolean): Int 返回与给定谓词匹配的第一个字符的索引,如果字符序列不包含任何此类字符,则返回-1
CharSequence.getOrElse(index: Int, defaultValue: (Int) ->Char): Char 如果索引超出当前字符序列的范围,它将返回指定索引处的字符或调用defaultValue函数的结果。
CharSequence.getOrNull(index: Int): Char? 它返回给定索引处的字符,如果索引超出字符序列的范围,则返回null


二、字符串截取


2.1 substring()函数


       substring函数支持IntRange类型(表示一个整数范围的类型)的参数,until创建的范围不包括上限值。


/**
 * 返回由给定的 [范围] 索引指定的子字符串。
 */
public fun String.substring(range: IntRange): 
//这里需要注意:range.endInclusive + 1
String = substring(range.start, range.endInclusive + 1)
/**
 *返回从 [startIndex] 开始到 [endIndex] 之前结束的此字符序列范围中的字符子字符串。
  *
  * @param startIndex 起始索引(含)。
  * @param endIndex 结束索引(独占)。 如果未指定,则使用字符序列的长度。
 */
@kotlin.internal.InlineOnly
public inline fun CharSequence.substring(startIndex: Int, endIndex: Int = length): String = subSequence(startIndex, endIndex).toString()
/**
 * 返回此字符序列的指定 [范围] 索引处的字符子字符串。
 */
public fun CharSequence.substring(range: IntRange): String = subSequence(range.start, range.endInclusive + 1).toString()


看到这里你会发现他们最后调用的还是String.subSequence()函数。这里咱们先看看substring。


    //字符串截取
    var intercept = "Write better Android apps faster with Kotlin."
    println(intercept.length)//45
    println(intercept.substring(10))//er Android apps faster with Kotlin.
    println(intercept.substring(10,18))//er Andro
    println(intercept.substring(10 until 18))//er Andro
    println(intercept.substring(IntRange(10,18)))//er Androi


使用subString(startIndex,endIndex)和subString(rang)时的区别。结合源码和实例可以看出。


下标越界


       如上面代码,intercept的字符串长度为45,咱们看下面代码:


    println(intercept.substring(30,46))
    println(intercept.substring(IntRange(30,46)))


微信图片_20220524221519.png


切记下标越界的情况。即StringIndexOutOfBoundsException异常


2.2 subSequence()函数


       从当前字符序列返回从startIndex开始到endIndex新的字符序列


1.    var intercept = "Write better Android apps faster with Kotlin."
    println(intercept.length)//45
    println(intercept.subSequence(10, 18))//er Andro


三、字符串分割


       split函数返回的是List集合数据,Lst集合又支持解构语法特性,它允许你在一个表达式里给多个变量赋值,解构常用来简化变量的赋值。


3.1 使用字符或字符串分割


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


    //字符串分割
    var cf = "Android|Java|Kotlin"
    var data = cf.split("|")
    println(data)    


 这个跟Java类似,只不过返回的是个List集合数据。


微信图片_20220524221708.png


解构语法


     var cf = "Android|Java|Kotlin"
    //解构语法
    var (zero, one, two) = cf.split("|")
    println("$zero-$one-$two")
    //解构语法过滤元素,通过_符号过滤掉不想要的元素
    //如,不想接收第二个元素则可以用 "_"
    var (zero2, _, two2) = cf.split("|")
    println("$zero2-$two2")


微信图片_20220524221741.png


3.2 使用正则表达式分割


       在Kotlin中使用正则表达式,使用的是Regex类,而Java中使用正则表达式使用的Pattern类。


1.    var dataRegex = cf.split(Regex("[ao]"))
    //[Andr, id|J, v, |K, tlin]
    println(dataRegex.toString())
    dataRegex = cf.split(Pattern.compile("[ao]"))
    //[Andr, id|J, v, |K, tlin]
    println(dataRegex.toString())


四、字符串替换


       Kotlin除了实现Java中的replace()函数外,还提供了另外的replaceFirst()、replaceAfter()、replaceBefore()、replaceIndent()等函数。


4.1 replace()函数


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


4.1.1 replace(oldValue: String, newValue: String, ignoreCase: Boolean = false)


       把原字符串中的某一个字符全部替换成新的字符。然后返回新的字符串


  • oldChar: 需要替换的字符


  • newChar: 新的字符


  • ignoreCase : 是否引用Java中的replace()函数。默认值为false,即用Java的replace()函数


    var th = "Write better Android apps faster with Kotlin."
    // 把字符t全部替换为!
    println(th)
    println(th.replace("t", "!"))


微信图片_20220524221912.png


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


       根据定义的正则规则去匹配源字符串,把满足规则的字符串通过transform{}高阶函数映射的新字符串替换。


  • regex: 正则表达式,用来决定要替换哪些字符


  • transform: 高阶函数(匿名函数,用来确定该如何替换正则表达式搜索到的字符)


    var reg= th.replace(Regex("[rte]")){
        when(it.value){
            "r" ->"7"
            "t" ->"!"
            "e" ->"5"
            else -> it.value
        }
    }
    println(reg)


微信图片_20220524221957.png


其他两个函数就不占用篇幅了,用法是一样的。


4.2 replaceFirst()函数


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


    //把第一个字符A替换为V
    println(th.replaceFirst("e", "V"))
    //把第一个字符串er替换为Victory
    println(th.replaceFirst("er", "Victory"))


微信图片_20220524222040.png


4.3 replaceAfter()函数


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


    //截取字符p,并在其后面加上Kotlin
    println(th.replaceAfter("p", "Kotlin"))
    //截取字符串Android,并在其后面加上帅次
    println(th.replaceAfter("Android", "帅次"))


微信图片_20220524222114.png


4.4 replaceBefore()函数


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


    //截取字符p,并在其前面加上Kotlin
    println(th.replaceBefore("p", "Kotlin"))
    //截取字符串Android,并在其前面加上帅次
    println(th.replaceBefore("Android", "帅次"))


微信图片_20220524222152.png


4.5 replaceIndent()函数


       检测常见的最小缩进,并将其替换为指定的 newIndent。


1.    var indent  = "            aaa       aaaA"
    println(indent)
    //检测常见的最小缩进,并将其替换为指定的 newIndent。
    println(indent.replaceIndent())
    //检测所有输入行的通用最小缩进,将其从每一行中删除,如果第一行和最后一行是空白的,也将其删除(注意空白与空的区别)
    println(indent.trimIndent())


微信图片_20220524222232.png

相关文章
|
4月前
|
Kotlin 索引
Kotlin中的字符串基本操作
Kotlin中的字符串基本操作
231 3
|
4月前
|
存储 Kotlin
Kotlin中布尔类型、字符类型、字符串类型和数组类型
Kotlin中布尔类型、字符类型、字符串类型和数组类型
|
2月前
|
存储 Java Kotlin
Kotlin 字符串教程:深入理解与使用技巧
Kotlin中的字符串用于存储文本,定义时使用双引号包围字符序列,如`var greeting = "Hello"`。Kotlin能自动推断变量类型,但在未初始化时需显式指定类型,如`var name: String`。可通过索引访问字符串元素,如`txt[0]`获取首字符。字符串作为对象,拥有属性和方法,如`length`获取长度,`toUpperCase()`转大写。可使用`compareTo()`比较字符串,`indexOf()`查找子串位置。字符串中嵌入单引号表示文本内的引号,如`"It's alright"`。使用`+`或`plus()
31 3
|
2月前
|
安全 Java Android开发
Kotlin字符串秘籍:解锁高效处理与创意应用,让你的代码闪耀不凡!
【8月更文挑战第2天】Kotlin是一门现代化的静态类型语言,以简洁、安全及强互操作性著称,在Android及服务器端开发中广受好评。本文通过与其他语言对比,深入解析Kotlin中字符串的基础和高级用法。Kotlin简化了字符串拼接,支持直接使用`+`操作符,并引入了直观的字符串模板。它提供了丰富的字符串操作函数,如使用索引范围进行子字符串提取,增强了代码的可读性。Kotlin字符串的不可变性提升了程序稳定性。利用扩展函数特性,可以轻松定制字符串行为,提高代码的模块化和重用性。掌握这些技巧能显著提升开发效率和代码质量。
30 1
|
11月前
|
编译器 C++ Kotlin
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
62 0
|
5月前
|
存储 安全 Java
《Kotlin核心编程》笔记:val 和 var & 字符串
《Kotlin核心编程》笔记:val 和 var & 字符串
69 0
|
XML 前端开发 安全
kotlin使用spring mvc将接收的字符串生成二维码并响应
使用kotlin制作一个基于`spring mvc`的小demo:接收请求中的字符串参数,用`zxing`将字符串生成出一个二维码,再返回给前端。可以通过此例来了解kotlin与spring的搭配
253 1
|
Java Android开发 Kotlin
【Kotlin 初学者】字符串常用操作汇总(下)
五、字符串比较 六、字符串查找 七、字符串验证 八、大杂烩
405 0
【Kotlin 初学者】字符串常用操作汇总(下)
|
Java Android开发 图形学
Android修行手册之Kotlin-【变量和常量】、【基础类型】、【字符串】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
219 0
|
22天前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
45 1
下一篇
无影云桌面