Kotlin字符串与Java字符串完全相同。Kotlin通过提供一系列有用的扩展函数,使标准Java字符串使用起来更加方便。
3.5.1 分割字符串
我们先回顾java中是怎么分割字符串的
当代码写
String[] strings = "12.3456-6.A".split(".");
我们期待返回的结果是【12,3456-6,A】,但返回的是一个空数组!这是因为它将一个正则表达式作为参数,并根据正则表达式将字符串分割成多个字符串。这里点号(.)是表示任何字符的正则表达式。
Kotlin把这个令人费解的函数隐藏了,作为替换,它提供了一些名为split的具有不同参数的重载的扩展函数,用来承载正则表达式的值需要一个Regex类型,而不是String。这样确保了当有一个字符串传递到这个函数的时候,不会被当作正则表达式。
这里用一个“.”或者“-”来分割字符串
"12.3456-6.A".split("\\.|-".toRegex()) //显式的创建一个正则表达式
>>>
[12,345,6,A ]
在Kotlin中,可以使用扩展函数toRegex将字符串转换为正则表达式。
但对于一些简单的情况,就不需要使用正则表达式了。Kotlin中的split扩展函数的其他重载支持任意数量的纯文本字符串分隔符:
"12.3456-6.A".split(".","-") 指定多个分隔符
>>>
[12,345,6,A ]
3.5.2 正则表达式和三重引号的字符串
来看另外一个例子中的两种不同实现:一个将使用扩展函数来处理字符串,另外一个将使用正则表达式。任务是将解析文件的完整路径名称到对应的组件:目录、文件名和扩展名。Kotlin标准库中包含了一些可以用来获取在给定分隔符第一次(或最后一次)出现之前(或之后)的子字符串的函数:
一、使用String的扩展函数来解析文件路径
fun parsePath(path: String)
{
val directory = path.substringBeforeLast("/")
val fullName = path.substringAfterLast("/")
val fileName = fullName.substringBeforeLast(".")
val extension = fullName.substringAfterLast(".")
println("directory = $directory")
println("fullName = $fullName")
println("fileName = $fileName")
println("extension = $extension")
}
parsePath("/sdcard/erpWebServer/video/cyk.mp4")
>>>
directory = /sdcard/erpWebServer/video
fullName = cyk.mp4
fileName = cyk
extension = mp4
解析字符串在Kotlin中变得更加容易,而且不需要使用正则表达式,功能很强大,然而有时代码却让人费解。如果使用正则表达式也可以使用Kotlin标准库:
二、使用正则表达式解析文件路径
// 与java的捕获组类似
fun parsePath(path: String) {
val regex = """(.+)/(.+)\.(.+)""".toRegex()
val matchResult = regex.matchEntire(path)
if (matchResult != null) {
val (directory, fileName, extension) = matchResult.destructured
println("directory = $directory")
println("fileName = $fileName")
println("extension = $extension")
}
}
>>>
directory = /sdcard/erpWebServer/video
fileName = cyk
extension = mp4
在这个例子中,正则表达式写在一个三重引号的字符串中。在这样的字符串中,不需要对任何字符进行转义,包括反斜线,正如写一个普通的字符串的字面值一样。
如果匹配成功,则将它的destructured属性赋值给相应的变量。这个和使用Pair初始化两个变量的语法是相同的。叫做解构声明,在之后的运算符部分会讲到。
3.5.3 多行三重引号字符串
三重引号字符串的目的不仅在于避免转义字符,而且使它可以包含任何字符,包括换行符。另外,它提供了一种更简单的方法,从而可以简单地把包含换行符的文本嵌入到程序中。例如,用ASCII码来画:
val kotlinLogo = """| // .|// .|/ \""" println(kotlinLogo.trimMargin("."))
>>>
| //
|//
|/ \
多行字符串包含三重引号之间的所有字符,包括用于格式化代码的缩进。如果要更好地表示这样的字符串,可以去掉缩进(左边距)。为此,可以向字符串内容添加前缀,标记边距的结尾,然后调用trimMargin来删除每行中的前缀和前面的空格。
参考《Kotlin实战》