我想使用golangs regexp替换所有空白行和仅用空格/制表符填充的行。我以为下面的regexp应该可以解决问题, emptyLINE := regexp.MustCompile(^\s*$) 但令我惊讶的是,行首^和行尾$regexp标签不起作用。它们似乎表示整个字符串的开始/结束,而不仅仅是字符串中的一行,请参阅
emptyLINE := regexp.MustCompile(
)
^
$
https://play.golang.org/p/WZ4flVtDMN
我在这里想念什么吗?
编辑:
您需要传递(?m)内联修饰符:
(?m)
regexp.MustCompile(`(?m)^\s*$`) ^^^^
在MULTILINE修改将使^匹配的起始 线 和$与之匹配的结束 行 :
m 多行模式:^和$匹配开始/结束线除了开始/结束文本(默认为false)
m
要记住的另一件事是\s匹配[\t\n\f\r ]符号。如果要匹配所有水平空白,可以使用[ \t]或[\t\p{Zs}]。这样一来,您就可以保持在边界内。
\s
[\t\n\f\r ]
[ \t]
[\t\p{Zs}]
而另一件事:$只发出一个换行符后的位置,它不会消耗,所以,实际上你需要匹配\r或\n或\r\n后$(如果你需要删除的换行符,太)。
\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符号。
^\s*$[\r\n]*
在[\r\n]+\s+\z备选的匹配1个或多个CR或LF符号,1+空格然后字符串的明确的结束\z,如果没有它,^\s*$[\r\n]*将不匹配的最后一个空行。
[\r\n]+\s+\z
\z