我想使用 golangs regexp 替换所有空白行和仅用空格/制表符填充的行。我认为下面的正则表达式应该可以解决问题,
空行 := regexp.MustCompile(`^\s*$`)
但令人惊讶的是,行首 ^
和行尾 $
正则表达式标记不起作用。它们似乎表示整个字符串的开始/结束,而不仅仅是字符串中的一行,请参阅
https://play.golang.org/p/WZ4flVtDMN
我在这里遗漏了什么吗?
编辑:
Wiktors 的回答几乎让我到达那里,但我仍然无法删除所有想要的行: https://play.golang.org/p/1IpETpFKCU
最佳答案
您需要传递(?m)
内联修饰符:
regexp.MustCompile(`(?m)^\s*$`)
^^^^
MULTILINE modifier将使 ^
匹配行的开头,$
将匹配行的结尾:
m
multi-line mode:^
and$
match begin/end line in addition to begin/end text (default 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+ 空格、 Assets 行的结尾 ($
) 然后匹配 0+ LF/CR 符号。
[\r\n]+\s+\z
替代项匹配 1 个或多个 CR 或 LF 符号、1 个以上空格以及字符串 \z
的明确结尾>,没有它,^\s*$[\r\n]*
将不会匹配最后一个空行。
关于regex - golang正则表达式删除所有空白行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40032254/