前言
本篇主要介绍Kotlin
中的StringBuilder
的字符串处理方面的知识。和java
中的字符串一样,
我们如果要处理大量的字符串拼接等操作,建议使用StringBuilder
而非String
。
因为这两者之间在大数据处理中,对于性能的影响差别比较大。
相较于String
,StringBuilder
的优点在于,在追加,修改,删除,插入时不会产生新的对象。
而String
会产生新的对象。每次String
数据的变化都会创建新的对象进行存储,开辟新的内存空间。
类基础介绍
StringBuilder
在Kotlin
中的包路径为:kotlin.text.StringBuilder
。
它总共有3个构造方法:
StringBuilder()
:创建一个空数据的StringBuilder
对象,它将会默认开辟16个字符空间。StringBuilder(capacity : Int)
: 创建一个空数据的StringBuilder
,但是会以我们传的值开辟空间。(这个空间并不是固定了StringBuilder
的长度,只是告诉系统,初始化的时候给先给多大的空间。)StringBuilder(seq : CharSequence)
:指定一个CharSequence
对象创建StringBuilder
。因为String
和StringBuilder
都是集成了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
传值。
下面介绍关于正则表达式,该方法可以用于String
和StringBuilder
。
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]
当我们分割成三项之后,后面的即使满足要求也不进行分割了。
评论区