您需要传递(?m) 内联修饰符:
regexp.MustCompile(`(?m)^\s*$`)
^^^^
MULTILINE modifier 将使^ 匹配行 的开头,$ 将匹配行 的结尾:
m 多行模式:^ 和 $ 匹配开始/结束行以及开始/结束文本(默认为 false)
要记住的另一件事是\s 匹配[\t\n\f\r ] 符号。如果要匹配所有水平空格,可以使用[ \t] 或[\t\p{Zs}]。这将使您保持在线范围内。
还有一件事:$ 只在换行后断言位置,它不会消耗它,所以,你需要在$ 之后实际匹配\r 或\n 或\r\n(如果你也需要删除换行符)。
这就是我想出的 (demo):
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(?m)^\s*$[\r\n]*|[\r\n]+\s+\z`)
in := `
test
test
`
want_empty := ` test
test `
fmt.Printf("have [%v]\n", in)
fmt.Printf("want [%v]\n", want_empty)
fmt.Printf("got [%v]\n", re.ReplaceAllString(in, ""))
}
^\s*$[\r\n]* - 匹配行首、任何 0+ 个空格、资产行尾 ($),然后匹配 0+ 个 LF/CR 符号。
[\r\n]+\s+\z 替代项匹配 1 个或多个 CR 或 LF 符号、1+ 个空格,然后是字符串 \z 的明确结尾,如果没有它,^\s*$[\r\n]* 将无法匹配最后一个空行。