删除Golang中包含特定子字符串的行

093gszye  于 2023-11-14  发布在  Go
关注(0)|答案(5)|浏览(173)

如何删除[]byte中以特定子字符串开头的行,在Ruby中,我通常会这样做:

  1. lines = lines.split("\n").reject{|r| r.include? 'substring'}.join("\n")

字符串
如何在Go上执行此操作?

xwbd5t1u

xwbd5t1u1#

你可以用regexp来模拟:

  1. re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")
  2. res := re.ReplaceAllString(s, "")

字符串
(The OP Kokizzu"(?m)^.*" +substr+ ".*$[\r\n]+"搭配使用)
参见this example

  1. func main() {
  2. s := `aaaaa
  3. bbbb
  4. cc substring ddd
  5. eeee
  6. ffff`
  7. re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")
  8. res := re.ReplaceAllString(s, "")
  9. fmt.Println(res)
  10. }


产出:

  1. aaaaa
  2. bbbb
  3. eeee
  4. ffff


注意regexp flag (?m)的用法:
多行模式:^$除了匹配开始/结束文本外,还匹配开始/结束行(默认为假)

展开查看全部
bnlyeluc

bnlyeluc2#

我相信使用bytes包来完成这个任务比使用regexp更好。

  1. package main
  2. import (
  3. "fmt"
  4. "bytes"
  5. )
  6. func main() {
  7. myString := []byte("aaaa\nsubstring\nbbbb")
  8. lines := bytes.Replace(myString, []byte("substring\n"), []byte(""), 1)
  9. fmt.Println(string(lines)) // Convert the bytes to string for printing
  10. }

字符串
输出量:

  1. aaaa
  2. bbbb


Try it here.

展开查看全部
h7appiyu

h7appiyu3#

问题标题与原始问题的措辞方式并不具有相同的含义。作为可接受的解决方案提供的Regex并没有解决我在查找匹配子串时删除整行的用例,就像问题标题所指示的那样。
为了在Go语言中删除包含某些子字符串的行(问题的标题),你可以在Go语言中实现一些与Kokizzu最初编写的Ruby代码非常相似的东西。

  1. func removeLinesContainingAny(input string, toRemove []string) string {
  2. if !strings.HasSuffix(input, "\n") {
  3. input += "\n"
  4. }
  5. lines := strings.Split(input, "\n")
  6. for i, line := range lines {
  7. for _, rm := range toRemove {
  8. if strings.Contains(line, rm) {
  9. lines = append(lines[:i], lines[i+1:]...)
  10. }
  11. }
  12. }
  13. input = strings.Join(lines, "\n")
  14. input = strings.TrimSpace(input)
  15. input += "\n"
  16. return input
  17. }

字符串
测试用例:https://go.dev/play/p/K-biYIO1kjk
特别是,您需要确保在输入字符串的末尾有一个新行,否则在某些情况下会出现slice bounds out of range的恐慌。

展开查看全部
ekqde3dh

ekqde3dh4#

如果子字符串在第一行,@VonC的accepted solution将不起作用,如果子字符串在最后一行,@Tony的regex将不起作用(demo
这应该对双方都有效:

  1. func main() {
  2. s := `aaaaa substring aaaa
  3. bbbb
  4. cc substring ddd
  5. eeee
  6. ffff substring`
  7. re := regexp.MustCompile("(?m)([\r\n]^.*substring.*$)|(^.*substring.*$[\r\n])")
  8. res := re.ReplaceAllString(s, "")
  9. fmt.Println(res)
  10. }

字符串
输出量:

  1. bbbb
  2. eeee


Try it out

展开查看全部
vaj7vani

vaj7vani5#

当您需要删除顶行时,此已批准的解决方案将不起作用:

  1. func main() {
  2. s := `aaaaa substring
  3. bbbb
  4. cc substring ddd
  5. eeee
  6. ffff`
  7. re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")`enter code here`
  8. res := re.ReplaceAllString(s, "")
  9. fmt.Println(res)
  10. }

字符串

相关问题