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