3.5 字符串和正则表达式的处理

版权声明:本文为博主原创文章,转载请标注 https://blog.csdn.net/cai784921129/article/details/81541231

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实战》

猜你喜欢

转载自blog.csdn.net/cai784921129/article/details/81541231
3.5