如何从Golang中的字符串中删除多余的空格/空格?

时间:2016-05-18 05:04:19

标签: regex go

我想知道如何删除:

  • 所有前导/尾随空格或换行符,空字符等
  • 字符串中的任何冗余空格(例如" hello [space] [space] world"将转换为" hello [space] world")

这是否可以使用单个正则表达式,对国际空间字符支持unicode等?

6 个答案:

答案 0 :(得分:43)

您只需使用strings软件包,strings.Fields即可完成大部分工作:

package main

import (
    "fmt"
    "strings"
)

func standardizeSpaces(s string) string {
    return strings.Join(strings.Fields(s), " ")
}

func main() {
    tests := []string{" Hello,   World  ! ", "Hello,\tWorld ! ", " \t\n\t Hello,\tWorld\n!\n\t"}
    for _, test := range tests {
        fmt.Println(standardizeSpaces(test))
    }
}
// "Hello, World !"
// "Hello, World !"
// "Hello, World !"

答案 1 :(得分:17)

您似乎可能希望同时使用\s速记字符类和\p{Zs} Unicode属性来匹配Unicode空格。但是,由于需要两个不同的替换,因此无法使用1个正则表达式替换执行这两个步骤,ReplaceAllStringFunc仅允许将整个匹配字符串作为参数(我不知道如何检查哪个组匹配)。

因此,我建议使用两个正则表达式:

  • ^[\s\p{Zs}]+|[\s\p{Zs}]+$ - 匹配所有前导/尾随空格
  • [\s\p{Zs}]{2,} - 匹配字符串中的2个或更多空白符号

示例代码:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    input := "   Text   More here     "
    re_leadclose_whtsp := regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`)
    re_inside_whtsp := regexp.MustCompile(`[\s\p{Zs}]{2,}`)
    final := re_leadclose_whtsp.ReplaceAllString(input, "")
    final = re_inside_whtsp.ReplaceAllString(final, " ")
    fmt.Println(final)
}

答案 2 :(得分:1)

strings.Fields()在任意数量的空格上分割,因此:

strings.Join(strings.Fields(strings.TrimSpace(s)), " ")

答案 3 :(得分:0)

避免浪费时间的正则表达式或外部库
我选择使用普通的golang而不是regexp,因为每种语言都有一些不是ASCII的特殊字符。

去Golang!

func RemoveDoubleWhiteSpace(str string) string {
    var b strings.Builder
    b.Grow(len(str))
    for i := range str {
        if !(str[i] == 32 && (i+1 < len(str) && str[i+1] == 32)) {
            b.WriteRune(rune(str[i]))
        }
    }
    return b.String()
}

及相关测试

func TestRemoveDoubleWhiteSpace(t *testing.T) {
    data := []string{`  test`, `test  `, `te  st`}
    for _, item := range data {
        str := RemoveDoubleWhiteSpace(item)
        t.Log("Data ->|"+item+"|Found: |"+str+"| Len: ", len(str))
        if len(str) != 5 {
            t.Fail()
        }
    }
}

答案 4 :(得分:0)

使用单个 regexp 使用 regexp.MustCompile() 抓取所有空格并将它们替换为单个空格,最后修剪前导空格。

    package main

    import (
        "fmt"
        "regexp"
        "strings"
    )
    
    func main() {
        input := "    Text   More here        "
        re := regexp.MustCompile(`\s+`)
        out := re.ReplaceAllString(input, " ")
        out = strings.TrimSpace(out)
        fmt.Println(out)
    } 

或者,使用“_”代替空格。

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    input := "___Text___More_here______"
    re := regexp.MustCompile(`_+`)
    out := re.ReplaceAllString(input, "_")
    out = strings.Trim(out, "_")
    fmt.Println(out)
}

答案 5 :(得分:-1)

使用正则表达式。

func main() {
    data := []byte("   Hello,   World !   ")
    re := regexp.MustCompile("  +")
    replaced := re.ReplaceAll(bytes.TrimSpace(data), []byte(" "))
    fmt.Println(string(replaced))
    // Hello, World !
}

为了修剪换行符和空字符,您可以使用bytes.Trim(src []byte, cutset string)函数代替bytes.TrimSpace