如何删除[]byte中以特定子字符串开头的行,在Ruby中,我通常会这样做:
[]byte
Ruby
lines = lines.split("\n").reject{|r| r.include? 'substring'}.join("\n")
字符串如何在Go上执行此操作?
Go
xwbd5t1u1#
你可以用regexp来模拟:
re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$") res := re.ReplaceAllString(s, "")
字符串(The OP Kokizzu与"(?m)^.*" +substr+ ".*$[\r\n]+"搭配使用)参见this example
"(?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 flag (?m)的用法:多行模式:^和$除了匹配开始/结束文本外,还匹配开始/结束行(默认为假)
^
$
bnlyeluc2#
我相信使用bytes包来完成这个任务比使用regexp更好。
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.
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的恐慌。
slice bounds out of range
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的
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) }
字符串
5条答案
按热度按时间xwbd5t1u1#
你可以用regexp来模拟:
字符串
(The OP Kokizzu与
"(?m)^.*" +substr+ ".*$[\r\n]+"
搭配使用)参见this example
型
产出:
型
注意regexp flag (?m)的用法:
多行模式:
^
和$
除了匹配开始/结束文本外,还匹配开始/结束行(默认为假)bnlyeluc2#
我相信使用
bytes
包来完成这个任务比使用regexp
更好。字符串
输出量:
型
Try it here.
h7appiyu3#
问题标题与原始问题的措辞方式并不具有相同的含义。作为可接受的解决方案提供的Regex并没有解决我在查找匹配子串时删除整行的用例,就像问题标题所指示的那样。
为了在Go语言中删除包含某些子字符串的行(问题的标题),你可以在Go语言中实现一些与Kokizzu最初编写的Ruby代码非常相似的东西。
字符串
测试用例:https://go.dev/play/p/K-biYIO1kjk
特别是,您需要确保在输入字符串的末尾有一个新行,否则在某些情况下会出现
slice bounds out of range
的恐慌。ekqde3dh4#
如果子字符串在第一行,@VonC的accepted solution将不起作用,如果子字符串在最后一行,@Tony的regex将不起作用(demo)
这应该对双方都有效:
字符串
输出量:
型
Try it out的
vaj7vani5#
当您需要删除顶行时,此已批准的解决方案将不起作用:
字符串