【问题标题】:Kotlin - How to trim all leading spaces from a multiline string?Kotlin - 如何从多行字符串中修剪所有前导空格?
【发布时间】:2021-08-14 02:52:15
【问题描述】:

String.trim() 不适用于使用buildString 构建的字符串。例如,

val s = buildString {
    append("{")
    append('\n')
    append(" ".repeat(5))
    append("hello")
    append(" ".repeat(7))
    append("world")
    append("}")
}
println(s.trim())

打印出来

{
     hello       world}

但我需要它来打印

{
hello
world
}

如何在不编写自己的修剪方法的情况下修剪缩进?

【问题讨论】:

  • 您可能想使用trimIndent(),而不是trim()
  • trim() 仅删除字符串开头和结尾的空格。它不会删除字符串中的空格。
  • @broot trimIndent() 不会删除一行中的所有前导空格
  • 您的示例代码仅包含一个换行符。对吗?

标签: string kotlin whitespace trim


【解决方案1】:

trim() 仅删除整个字符串开头和结尾的空格,而不是每行。您可以使用以下命令从每行中删除空格:

s.lineSequence()
    .map { it.trim() }
    .joinToString("\n")

请注意,作为副作用,上述代码会将所有行尾转换为LF ("\n")。您可以将"\n" 替换为"\r\n""\r" 以获得不同的结果。为了使行尾与原始字符串中的行尾完全相同,我们需要一个更复杂的解决方案。

【讨论】:

  • 我们应该注意到这个解决方案不保留行尾。
  • @Joffrey 您的意思是它将 CR 和 CRLF 转换为 LF,对吗?感谢您注意到这一点。
  • 是的,我就是这个意思。感谢您的编辑。大多数时候这应该不是问题,但我们永远不知道未来会阅读这个问题的人的需求:)
【解决方案2】:

一个班轮:

s.lines().joinToString(transform = String::trim, separator = "\n")

【讨论】:

  • 我们应该注意到这个解决方案不保留行尾。
【解决方案3】:

您可以使用正则表达式来修剪前导空格:

val s = buildString {
    append("{")
    append('\n')
    append(" ".repeat(5))
    append("hello\n")
    append(" ".repeat(7))
    append("world\n")
    append("}")
}
println(s.replace(Regex("""^\s+""", RegexOption.MULTILINE), ""))

输出:

{
hello
world
}

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2010-09-16
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2011-11-11
    相关资源
    最近更新 更多