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

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

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

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

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

xwbd5t1u

xwbd5t1u1#

你可以用regexp来模拟:

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

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

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 flag (?m)的用法:
多行模式:^$除了匹配开始/结束文本外,还匹配开始/结束行(默认为假)

bnlyeluc

bnlyeluc2#

我相信使用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


Try it here.

h7appiyu

h7appiyu3#

问题标题与原始问题的措辞方式并不具有相同的含义。作为可接受的解决方案提供的Regex并没有解决我在查找匹配子串时删除整行的用例,就像问题标题所指示的那样。
为了在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的恐慌。

ekqde3dh

ekqde3dh4#

如果子字符串在第一行,@VonC的accepted solution将不起作用,如果子字符串在最后一行,@Tony的regex将不起作用(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


Try it out

vaj7vani

vaj7vani5#

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

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)
}

字符串

相关问题