Android开发Android开发经验谈Kotlin

Kotlin3.5字符串和正则表达式的处理

2018-05-28  本文已影响20人  无心下棋

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来删除每行中的前缀和前面的空格。

上一篇下一篇

猜你喜欢

热点阅读