我想使用golangs regexp替换所有空白行和仅用空格/制表符填充的行。我认为以下正则表达式可以做到这一点,
emptyLINE := regexp.MustCompile(`^\s*$`)
但感到惊讶的是,行^
的开头和行$
regexp标记的行尾不起作用。它们似乎表示整个字符串的开头/结尾而不是字符串中的一行,请参阅
https://play.golang.org/p/WZ4flVtDMN
我在这里错过了什么吗?
编辑:
Wiktors回答几乎让我在那里,仍然无法删除所有想要的行: https://play.golang.org/p/1IpETpFKCU
答案 0 :(得分:2)
您需要传递(?m)
内联修饰符:
regexp.MustCompile(`(?m)^\s*$`)
^^^^
MULTILINE modifier会使^
与行的开头匹配,$
将匹配行的结尾:
m
多行模式:^
和$
匹配开始/结束行以及开头/结尾文本(默认为false)
要记住的另一件事是\s
匹配[\t\n\f\r ]
符号。如果要匹配所有水平空格,可以使用[ \t]
或[\t\p{Zs}]
。这将让你留在界线范围内。
另一件事:$
仅在换行后断言位置,它不消耗它,因此,您需要实际匹配\r
或\n
或{{1} } \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, ""))
}
- 匹配一行的开头,任何0+空格,一行(^\s*$[\r\n]*
)的资产,然后匹配0 + LF / CR符号。
$
替代方案匹配1个或多个CR或LF符号,1个以上空格,然后是字符串[\r\n]+\s+\z
的明确结尾,没有它,\z
将不匹配最后一个空线。