Golang中去除多行字符串中的空行的惯用方法

8

如果我有一个多行字符串,例如:

this is a line

this is another line

什么是删除空行的最佳方法?我可以通过拆分、迭代和进行条件检查来实现,但是否有更好的方法?
4个回答

4
与 ΔλЛ 的答案类似,可以使用 strings.Replace 来实现:

func Replace(s, old, new string, n int) string Replace 函数返回将 s 字符串中前 n 个不重叠的 old 子串替换为 new 后得到的新字符串副本。若 old 为空,则匹配 s 字符串开头和每个 UTF-8 序列之后,最多可产生 k+1 次替换,其中 k 表示字符串 s 中 rune 的数量。若 n < 0,则没有替换次数限制。

package main

import (
    "fmt"
    "strings"
)

func main() {

    var s = `line 1
line 2

line 3`

    s = strings.Replace(s, "\n\n", "\n", -1)

    fmt.Println(s)
}

https://play.golang.org/p/lu5UI74SLo


这应该是更好的答案。 - john
这并没有删除第一个空行。 - Sanan Guliyev

2

假设你想要输出相同的字符串,但删除了空行,我会使用正则表达式:

import (
    "fmt"
    "regexp"
)

func main() {

    var s = `line 1
line 2

line 3`

    regex, err := regexp.Compile("\n\n")
    if err != nil {
        return
    }
    s = regex.ReplaceAllString(s, "\n")

    fmt.Println(s)
}

如果字符串是通过迭代一个巨大的切片获得的,你会建议使用哪个来提高性能?正则表达式还是迭代? - scott
我仍然建议使用正则表达式,但如果你想将这些字符串后面合并在一起(比如说,放到一个slice里面),那么使用string.Split()和迭代可能是更好的选择。 - syntagma
谢谢@REACHUS。非常感谢。 - scott
我不同意。如果字符串是在一个巨大的切片中获得的,即[]string。因此,为了应用正则表达式,您需要将该巨大的切片转换为字符串,这将消耗时间和内存,然后再应用正则表达式并将字符串转换回[]string。实际上,[]string中的空行将由rune '\n'表示,可以通过简单比较来识别。 - Markus W Mahlberg
@MarkusWMahlberg 我的理解是,一个 []string 中的单个元素将包含多行字符串。因此,使用正则表达式过滤掉空行是有意义的。然而,如果切片的单个元素表示单个行,则迭代切片并通过将其与 '\n' 进行比较来检查元素是否为空行当然更有效率。 - syntagma
据我所读,该字符串将从一个切片构建。好的,你的注释应该能够说明这一点。 ;) - Markus W Mahlberg

1
更通用的方法可能是这样的。
package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    s := `


    #### 

    ####




    ####


    ####




    `

    fmt.Println(regexp.MustCompile(`[\t\r\n]+`).ReplaceAllString(strings.TrimSpace(s), "\n"))
}

https://play.golang.org/p/uWyHfUIDw-o


0
为了提高@syntagma的响应,以删除所有空行:
import (
    "fmt"
    "regexp"
)

func main() {

    var s = `line 1
line 2

line 3`

    regex, _ := regexp.Compile(`\n{2,}`)
    s = regex.ReplaceAllString(s, "\n")

    fmt.Println(s)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接