

新闻资讯
技术学院本文介绍使用 go 标准库 `regexp` 高效过滤掉 `[]byte` 或字符串中包含特定子串的整行,支持跨平台换行符(`\n`/`\r\n`),并提供可直接运行的示例与关键注意事项。
在 Go 中,若需像 Ruby 的 split("\n").reject{|r| r.include?('substring')}.join("\n") 那样移除包含某子串的整行,推荐使用正则表达式配合多行模式((?m))实现——它能让 ^ 和 $ 分别匹配每行的开头与结尾,而非仅整个字符串首尾。
以下是一个完整、健壮的实现示例(支持 \n 和 \r\n 换行):
package main
import (
"fmt"
"regexp"
)
func removeLinesContaining(s, substr string) string {
// 构造正则:多行模式下匹配整行(含前导换行符),确保删除后不残留空行
// 使用 [\r\n]+ 匹配行首可能的换行符,^.*substr.*$ 匹配含子串的整行
pattern
:= "(?m)[\\r\\n]+^.*" + regexp.QuoteMeta(substr) + ".*$"
re := regexp.MustCompile(pattern)
result := re.ReplaceAllString(s, "")
// 可选:去除开头可能残留的换行符(如首行被删)
if len(result) > 0 && (result[0] == '\n' || result[0] == '\r') {
result = regexp.MustCompile(`^[\\r\\n]+`).ReplaceAllString(result, "")
}
return result
}
func main() {
s := `aaaaa
bbbb
cc substring ddd
eeee
ffff`
res := removeLinesContaining(s, "substring")
fmt.Println(res)
}输出结果:
aaaaa bbbb eeee ffff
✅ 关键要点说明:
综上,对于中小规模文本或注重代码可读性的场景,基于 regexp 的方案是 Go 中最贴近 Ruby 风格、兼顾正确性与简洁性的首选解法。