如何删除
[]byte
中以某些子字符串开头的行,在Ruby
中通常我会这样做:
lines = lines.split("\n").reject{|r| r.include? 'substring'}.join("\n")
如何在
Go
上执行此操作?
您可以使用正则表达式来模拟:
re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")
res := re.ReplaceAllString(s, "")
"(?m)^.*" +substr+ ".*$[\r\n]+"
)
参见这个例子
func main() {
s := `aaaaa
bbbb
cc substring ddd
eeee
ffff`
re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")
res := re.ReplaceAllString(s, "")
fmt.Println(res)
}
输出:
aaaaa
bbbb
eeee
ffff
注意使用 regexp 标志 (?m):
多行模式:
和^
除了开始/结束文本之外还匹配开始/结束行(默认 false)$
我相信使用
bytes
包来完成此任务比使用 regexp
更好。
package main
import (
"fmt"
"bytes"
)
func main() {
myString := []byte("aaaa\nsubstring\nbbbb")
lines := bytes.Replace(myString, []byte("substring\n"), []byte(""), 1)
fmt.Println(string(lines)) // Convert the bytes to string for printing
}
输出:
aaaa
bbbb
问题标题的含义与原始问题的措辞方式不同。作为可接受的解决方案提供的正则表达式无法解决我在查找匹配子字符串时删除整行的用例,如问题标题所示。
为了删除 Go 中包含某些子字符串的行(问题的标题),您可以在 Go 中实现一些与 Kokizzu 最初编写的 Ruby 代码非常相似的东西。
func removeLinesContainingAny(input string, toRemove []string) string {
if !strings.HasSuffix(input, "\n") {
input += "\n"
}
lines := strings.Split(input, "\n")
for i, line := range lines {
for _, rm := range toRemove {
if strings.Contains(line, rm) {
lines = append(lines[:i], lines[i+1:]...)
}
}
}
input = strings.Join(lines, "\n")
input = strings.TrimSpace(input)
input += "\n"
return input
}
请参阅此处的测试用例:https://go.dev/play/p/K-biYIO1kjk
特别是,你需要确保输入字符串的末尾有一个新行,否则在某些情况下你会因为
slice bounds out of range
而感到恐慌。
@VonC的接受的解决方案将不起作用,如果子字符串位于最后一行,@Tony的正则表达式将不起作用(demo)
这应该对两者都有效:
func main() {
s := `aaaaa substring aaaa
bbbb
cc substring ddd
eeee
ffff substring`
re := regexp.MustCompile("(?m)([\r\n]^.*substring.*$)|(^.*substring.*$[\r\n])")
res := re.ReplaceAllString(s, "")
fmt.Println(res)
}
输出:
bbbb
eeee
当您需要删除顶线时,此批准的解决方案将不起作用:
func main() {
s := `aaaaa substring
bbbb
cc substring ddd
eeee
ffff`
re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")`enter code here`
res := re.ReplaceAllString(s, "")
fmt.Println(res)
}