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

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

  • 写回答

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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题