侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Kotlin 进阶 StringBuilder 可变字符串学习介绍与 Regex正则表达式分割字符串。

Z同学
2022-02-27 / 0 评论 / 1 点赞 / 288 阅读 / 4,562 字
温馨提示:
本文最后更新于 2022-02-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

本篇主要介绍Kotlin中的StringBuilder 的字符串处理方面的知识。和java中的字符串一样,

我们如果要处理大量的字符串拼接等操作,建议使用StringBuilder而非String

因为这两者之间在大数据处理中,对于性能的影响差别比较大。

相较于StringStringBuilder 的优点在于,在追加,修改,删除,插入时不会产生新的对象。

String 会产生新的对象。每次String数据的变化都会创建新的对象进行存储,开辟新的内存空间。

类基础介绍

StringBuilderKotlin中的包路径为:kotlin.text.StringBuilder

image-20220227195230103

它总共有3个构造方法:

  1. StringBuilder() :创建一个空数据的StringBuilder对象,它将会默认开辟16个字符空间。
  2. StringBuilder(capacity : Int) : 创建一个空数据的StringBuilder,但是会以我们传的值开辟空间。(这个空间并不是固定了StringBuilder的长度,只是告诉系统,初始化的时候给先给多大的空间。)
  3. StringBuilder(seq : CharSequence) :指定一个CharSequence对象创建StringBuilder。因为StringStringBuilder都是集成了CharSequence接口对象。所以我们可以在StringBuilder的初始化中直接传递String,和StringBuilder

示例代码如下:

    var s: StringBuilder = StringBuilder()
    var s1 = StringBuilder("zinyan.com")
    var s2 = StringBuilder(2022)
    var s3 = StringBuilder(s)

我们可以通过函数了解StringBuilder 的缓冲容量:capacity 。我们在初始化的时候也可以配置容量大小。

var s: StringBuilder = StringBuilder()
s.capacity() //获取容量大小
s.length //获取字符串的长度

这个大小每当我们往StringBuilder填充数据,超过这个容量的时候,就会往下扩容。

字符串追加,删除,插入,替换

StringBuilder提供了很多修改String的函数。就如同我们的标题所说的。它们对象的函数分别如下:

  • stringBuilder.append(XXX):在当前字符后面追加新数据。
  • stringBuilder.insert(1,"zinyan"):在指定位置插入新的数据。
  • stringBuilder.delete(1,2) :删除从开始位置到结束位置的字符串。
  • stringBuilder.replace(1,3,"z"):将开始位置和结束位置期间的字符替换为新的值。

我们主要依赖这三个方法就可以实现基本的字符串的增删改操作了。

但是我们在修改过程中经常会看大,除了上面的传值外,还有一个regex传值。

下面介绍关于正则表达式,该方法可以用于StringStringBuilder

Regex 正则表达式

我们在普通操作的时候,也可以通过regex正则表达式的方式实现模糊匹配的删除与替换操作。

关于具体的正则表达式的一些规则可以看看这篇文章:正则表达式介绍,常用关键字和部分实例 (zinyan.com) 这里我就不深入详解正则表达式了。下面只是介绍下在StringBuilder中是如何使用的。

Kotlin中提供的正则表达式类是:Kotlin.text.Regex。有两种创建方式:

  • Regex(pattern : String) : 我们可以直接创建,传值就是正则表达式代码。
  • String("正则表达式").toRegex(): 我们可以创建一个String对象,然后使用toRegex()将该字符串转为正则表达式对象。

在现在几乎所有主流的编程语言,都支持通过正则表达式进行匹配String。来达到字符串的查找和判断逻辑。

我们可以通过它实现:

  • 字符串匹配:我们可以用来判断输入的字符串是否满足需要,例如是否输入身份证号,是否输入手机号。是否输入邮箱地址等等
  • 字符串查找:我们还可以在字符串中进行全局查询是否包含指定字符或则字符串。
  • 字符串替换:通常和查找联用,将查找的字符串替换成我们需要的字符串。
  • 字符串分割:根据关键字符将一整串字符串进行切割成一段一段的对象。

下面针对上面的介绍进行简单的代码示例和介绍。

字符串匹配-matches

关于字符串匹配有两个方法:

  • matches(input: CharSequence):Boolean :精确匹配函数,测试输入的字符串是否完全匹配。是返回true,否返回false。
  • containsMatchIn(input: CharSequence):Boolean:模糊匹配,测试出入的字符串是否部分匹配正则表达式,是返回true,否返回false。

示例代码:

fun main(args: Array<String>) {
    var reqex = Regex("""\d+""")//匹配全部是数值
    var input1 = "1002123"
    var input2 = "zinyan.com20220227"
    println(reqex.matches(input1))
    println(reqex.matches(input2))
    println(reqex.containsMatchIn(input1))
    println(reqex.containsMatchIn(input2))
}
//输出
true
false
true
true

结合实际代码,就能理解相关对的匹配规则了。

字符串查找-find

关于正则表达式的字符串查找,也有两个函数:

  • find(input: CharSequence, startIndex: Int = 0): MatchResult?:查找第一个匹配模式的字符串,并返回MatchResult?类型。
  • findAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult>:查找所有匹配模式的字符串,并返回Sequence类型。

简单理解就是,一个返回单一元素。一个返回数组集合元素。

示例代码:

fun main(args: Array<String>) {
    var reqex = Regex("""\d+""")//匹配全部是数值
    var input1 = "zinyan.com-2022-02-7"
    var value = reqex.find(input1)
    println("字符串中的第一个数值:${value?.value}") //因为有可能是找不到的,所以要添加? 告诉可能为空
    reqex.findAll(input1).forEach { v -> println("匹配到的数据:${v.value}") } //因为集合中不能为空,所以不用添加?
}
//输出结果
字符串中的第一个数值:2022
匹配到的数据:2022
匹配到的数据:02
匹配到的数据:7

上面并不是按照一个数值,一个数值匹配后分组。而是按照从匹配到不匹配,截取中间的这一整段结果。

字符串替换-replace

常见的替换方法有以下两个:

  • replace(input: CharSequence, replacement: String): String:第一项是输入值,第二项是要替换后的值。也就是将输入值中满足匹配内容的数据替换为第二项的值并最终输出。
  • replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String:和上面的方法是一样的,只是第二项的数据格式可以是MatchResult。

示例代码:

fun main(args: Array<String>) {
    var reqex = Regex("""\d+""")//匹配全部是数值
    var input1 = "zinyan.com-2022-02-7"
    var value = reqex.replace(input1, "XX")
    println("将数值替换为XX:$value")
}
//输出结果
将数值替换为XX:zinyan.com-XX-XX-XX

我们的常见替换,就是这样既可。我们除了String还可以直接传StringBuilder

fun main(args: Array<String>) {
    var reqex = Regex("""\d+""")//匹配全部是数值
    var  s = StringBuilder("zinyan.com-2022-02-27")
    var value = reqex.replace(s, "XX")
    println("将数值替换为XX:$value")
}
//输出结果
将数值替换为XX:zinyan.com-XX-XX-XX

字符串分割-spint

最后介绍关于分割,将字符串按照某个字符进行分割成字符串数组。关键函数:

  • split(input: CharSequence, limit: Int = 0): List<String>:将input输入的字符串对象,按按照正则表达式进行分割,limit:分割字符串的最大个数,默认为0代表不限制个数。返回结果为List集合对象。

示例:我们不限制个数

fun main(args: Array<String>) {
    var reqex = Regex("""\d+""")//匹配全部是数值
    var s = StringBuilder("ABCD1DEFG2IJK3OPS4")
    var value = reqex.split(s)
    println(value)
}
//输出结果
[ABCD, DEFG, IJK, OPS, ]

可以看到第四项值也分割了,但是由于没有字符串。

我们限制分割数:

fun main(args: Array<String>) {
    var reqex = Regex("""\d+""")//匹配全部是数值
    var s = StringBuilder("ABCD1DEFG2IJK3OPS4")
    var value = reqex.split(s,3)
    println(value)
}
//输出
[ABCD, DEFG, IJK3OPS4]

当我们分割成三项之后,后面的即使满足要求也不进行分割了。

1

评论区