Kotlin 字符串连接 - 保留多行字符串的缩进

标签 kotlin string-concatenation

Kotlin 的多行字符串处理在很多方面都非常出色,并且它的 .trimIndent() 功能允许您保持字符串文字与其余代码的缩进,如下所示:

fun main(args: Array<String>) {
    val myString = """
    hello
    world
""".trimIndent()

println(myString)

将打印出:

hello
world

代码中没有文字缩进。但是,如果插入的值是多行,那么使用 Kotlin 强大的字符串模板系统时就会出现问题:

fun main(args: Array<String>) {
    val myString = """
    hello
    world
""".trimIndent()
    
    println("""
        teststring2
        $myString
    """.trimIndent())
}

将打印出来

            teststring2
            hello
world

出现这种情况是因为 world 位于新行,并且没有收到 hello 所获得的缩进。有没有一种优雅的方式来处理这个问题?

最佳答案

这是第一个字符串文字。 (为了避免混淆,我将使用下划线来表示空格。)

____hello
____world

它的 trimIndent() 调用将删除空格,使其不缩进,如下所示:

hello
world

第二个字符串如下所示:

________teststring2
________$myString

然后 $myString 将被精确替换为第一个的内容:

________teststring2
________hello
world

请注意,$myString 之前的缩进仍然存在,为您在“hello”之前看到的空格提供了空间;但 myString 中没有缩进,因此您在“world”之前看不到任何缩进。

现在,trimIndent()删除“所有输入行的共同最小缩进”。但由于最后一行的原因,这里没有常见的缩进。因此第二个 trimIndent() 调用什么也不做。

至于做什么,可能有几种选择。如果您不需要任何缩进,那么最明显的方法是删除所有缩进,而不仅仅是常见的缩进。 (我认为标准库中没有专用函数,但编写一个函数应该很容易。例如,您可以使用正则表达式将 "^ *" 替换为 “”。)

关于Kotlin 字符串连接 - 保留多行字符串的缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65294629/

相关文章:

android - Kotlin 从其他类调用成员扩展函数

java - StringConcatFactory 中的策略

mysql - 为 select 语句添加前缀文本

java - 优化输入流读取速度更快/提高串联速度

java - 使用 '+' 运算符连接字符串后创建了多少个对象?

android - android应用开发用什么比较好?是kotlin还是java?

collections - 映射列表值以列出一个类轮

javascript - 在 JavaScript 中使用 `if` 语句连接字符串

java - 将包级 Java 注解转换为 Kotlin

android - 当两个EditText字段均输入至少一个字符时,启用按钮(Android)