2014-12-11 2 views
3

Как удалить строки, созданные с определенной подстроки в []byte, в Ruby обычно я делаю что-то вроде этого:Удалить строки, содержащие определенную подстроку в Golang

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

Как это сделать на Go?

+0

Ответы сильфонные может быть уместным, если вы уже посчастливилось иметь все данные в ломтиком байт, однако, в Go гораздо чаще (и полезно/эффективно/и т. д.), чтобы иметь данные в 'io.Reader' и фильтровать этот поток при чтении/записи. (Например, через '* os.File',' http.Response.Body', 'net.Conn' и т. Д.). –

ответ

5

Вы могли бы подражать, что с регулярным выражением:

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

(OP Kokizzuwent с "(?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):

режим многострочный: ^ и $ матч начала/конца строки в дополнение, чтобы начать/конец текста (по умолчанию ложное)

+0

спасибо, я в конечном итоге с '" (? M) ^. * "+ Substr +". * $ [\ R \ n] + "' – Kokizzu

+0

@Kokizzu Хороший выбор. Я включил его в ответ для большей наглядности. – VonC

1

Я считаю, используя 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.

+3

Согласитесь не использовать 'regexp'. В вопросе указан '[] byte' s, поэтому вы бы сделали то же самое, но с пакетом 'bytes', чтобы сохранить преобразование. – twotwotwo

Смежные вопросы