doubeng9407
2016-10-13 22:48
浏览 299
已采纳

golang regexp删除所有空白行

I want to replace all blank lines and lines filled only with spaces/tabs using golangs regexp. I thought the following regexp should do the trick, emptyLINE := regexp.MustCompile(`^\s*$`) but was surprised, that the begin of line ^ and end of line $ regexp tags do not work. They rather seem to signify the start/end of the whole string instead of just a line within the string, see

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

Am I missing something here?

EDIT:

Wiktors answer almost got me there, still I cannot remove all wanted lines: https://play.golang.org/p/1IpETpFKCU

图片转代码服务由CSDN问答提供 功能建议

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

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

我在这里缺少什么吗? \ n

编辑:

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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongyumiao5210 2016-10-13 22:49
    已采纳

    You need to pass the (?m) inline modifier:

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

    The MULTILINE modifier will make ^ match the start of the line and $ will match the end of a line:

    m        multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)

    Another thing to bear in mind is that \s matches [\t \f ] symbols. If you want to match all horizontal whitespaces, you may use [ \t] or [\t\p{Zs}]. That will let you stay inside the line bounds.

    And another thing: $ only asserts the position after a line break, it does not consume it, so, you need to actually match or or after $ (if you need to remove the linebreaks, too).

    This is what I came up with (demo):

    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
        re := regexp.MustCompile(`(?m)^\s*$[
    ]*|[
    ]+\s+\z`)
        in := ` 
          test 
    
    
        test  
         `
        want_empty := `   test 
        test    `
        fmt.Printf("have [%v]
    ", in)
        fmt.Printf("want [%v]
    ", want_empty)
        fmt.Printf("got  [%v]
    ", re.ReplaceAllString(in, ""))
    }
    

    The ^\s*$[ ]* - matches the start of a line, any 0+ whitespaces, assets the end of a line ($) and then matches 0+ LF/CR symbols.

    The [ ]+\s+\z alternative matches 1 or more CR or LF symbols, 1+ whitespaces and then the unambiguous end of string \z, without it, ^\s*$[ ]* won't match the last empty line.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题