一尘不染

golang regexp删除所有空白行

go

我想使用golangs regexp替换所有空白行和仅用空格/制表符填充的行。我以为下面的regexp应该可以解决问题, emptyLINE := regexp.MustCompile(^\s*$)
但令我惊讶的是,行首^和行尾$regexp标签不起作用。它们似乎表示整个字符串的开始/结束,而不仅仅是字符串中的一行,请参阅

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

我在这里想念什么吗?

编辑:

Wiktors的回答几乎使我到达了那里,但我仍然无法删除所有需要的行:https
//play.golang.org/p/1IpETpFKCU

阅读 447

收藏
2020-07-02

共1个答案

一尘不染

您需要传递(?m)内联修饰符:

regexp.MustCompile(`(?m)^\s*$`) 
                    ^^^^

MULTILINE修改将使^匹配的起始 线
$与之匹配的结束

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]*将不匹配的最后一个空行。

2020-07-02