【问题标题】:golang regexp remove all blank linesgolang regexp 删除所有空行
【发布时间】:2016-10-13 22:48:03
【问题描述】:

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

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

我错过了什么吗?

编辑:

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

【问题讨论】:

    标签: regex go


    【解决方案1】:

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

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

    MULTILINE modifier 将使^ 匹配 的开头,$ 将匹配 的结尾:

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

    【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多