如何删除[]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, "")
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 := `aaaaabbbbcc substring dddeeeeffff` re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$") res := re.ReplaceAllString(s, "") fmt.Println(res)}
func main() {
s := `aaaaa
bbbb
cc substring ddd
eeee
ffff`
fmt.Println(res)
}
型产出:
aaaaabbbbeeeeffff
aaaaa
ffff
型注意regexp flag (?m)的用法:多行模式:^和$除了匹配开始/结束文本外,还匹配开始/结束行(默认为假)
^
$
bnlyeluc2#
我相信使用bytes包来完成这个任务比使用regexp更好。
bytes
regexp
package mainimport ( "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}
package main
import (
"fmt"
"bytes"
)
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
字符串输出量:
aaaabbbb
aaaa
型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}
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)
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 aaaabbbbcc substring dddeeeeffff substring` re := regexp.MustCompile("(?m)([\r\n]^.*substring.*$)|(^.*substring.*$[\r\n])") res := re.ReplaceAllString(s, "") fmt.Println(res)}
s := `aaaaa substring aaaa
ffff substring`
re := regexp.MustCompile("(?m)([\r\n]^.*substring.*$)|(^.*substring.*$[\r\n])")
bbbbeeee
型Try it out的
vaj7vani5#
当您需要删除顶行时,此已批准的解决方案将不起作用:
func main() { s := `aaaaa substringbbbbcc substring dddeeeeffff` re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")`enter code here` res := re.ReplaceAllString(s, "") fmt.Println(res)}
s := `aaaaa substring
re := regexp.MustCompile("(?m)[\r\n]+^.*substring.*$")`enter code here`
字符串
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#
当您需要删除顶行时,此已批准的解决方案将不起作用:
字符串