golang regexp删除所有空白行

时间:2016-10-13 22:48:03

标签: regex go

我想使用golangs regexp替换所有空白行和仅用空格/制表符填充的行。我认为以下正则表达式可以做到这一点, emptyLINE := regexp.MustCompile(`^\s*$`) 但感到惊讶的是,行^的开头和行$ regexp标记的行尾不起作用。它们似乎表示整个字符串的开头/结尾而不是字符串中的一行,请参阅

https://play.golang.org/p/WZ4flVtDMN

我在这里错过了什么吗?

编辑:

Wiktors回答几乎让我在那里,仍然无法删除所有想要的行: https://play.golang.org/p/1IpETpFKCU

1 个答案:

答案 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将不匹配最后一个空线。