美文网首页Android开发Android开发经验谈Kotlin
Kotlin3.5字符串和正则表达式的处理

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

作者: 无心下棋 | 来源:发表于2018-05-28 21:03 被阅读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来删除每行中的前缀和前面的空格。

    相关文章

      网友评论

        本文标题:Kotlin3.5字符串和正则表达式的处理

        本文链接:https://www.haomeiwen.com/subject/hcjnjftx.html