Go语言 删除字符串中的所有空格

nxagd54h  于 2023-06-03  发布在  Go
关注(0)|答案(4)|浏览(542)

在Go语言中,从任意字符串中去掉所有空格的最快方法是什么?
我从字符串包中链接了两个函数:

response = strings.Join(strings.Fields(response),"")

有人有更好的方法来做到这一点吗?

t40tm48m

t40tm48m1#

我发现最简单的方法是使用字符串。ReplaceAll如下所示:

randomString := "  hello      this is a test"
fmt.Println(strings.ReplaceAll(randomString, " ", ""))

>hellothisisatest

Playground

mm9b1k5b

mm9b1k5b2#

下面是一些关于从字符串中剥离所有空格字符的几种不同方法的基准:(source data):

BenchmarkSpaceMap-8                     2000       1100084 ns/op      221187 B/op          2 allocs/op
BenchmarkSpaceFieldsJoin-8              1000       2235073 ns/op     2299520 B/op         20 allocs/op
BenchmarkSpaceStringsBuilder-8          2000        932298 ns/op      122880 B/op          1 allocs/op
  • SpaceMap:使用strings.Map;当遇到更多的非空白字符时,会逐渐增加分配的空间量
  • SpaceFieldsJoinstrings.Fieldsstrings.Join;生成大量中间数据
  • SpaceStringsBuilder使用strings.Builder;执行单个分配,但如果源字符串主要是空白,则可能会过度分配。
package main_test

import (
    "strings"
    "unicode"
    "testing"
)

func SpaceMap(str string) string {
    return strings.Map(func(r rune) rune {
        if unicode.IsSpace(r) {
            return -1
        }
        return r
    }, str)
}

func SpaceFieldsJoin(str string) string {
    return strings.Join(strings.Fields(str), "")
}

func SpaceStringsBuilder(str string) string {
    var b strings.Builder
    b.Grow(len(str))
    for _, ch := range str {
        if !unicode.IsSpace(ch) {
            b.WriteRune(ch)
        }
    }
    return b.String()
}

func BenchmarkSpaceMap(b *testing.B) {
    for n := 0; n < b.N; n++ {
        SpaceMap(data)
    }
}

func BenchmarkSpaceFieldsJoin(b *testing.B) {
    for n := 0; n < b.N; n++ {
        SpaceFieldsJoin(data)
    }
}

func BenchmarkSpaceStringsBuilder(b *testing.B) {
    for n := 0; n < b.N; n++ {
        SpaceStringsBuilder(data)
    }
}
eeq64g8w

eeq64g8w3#

来自rosettacode.org:
你可以找到这样的函数:

func stripChars(str, chr string) string {
    return strings.Map(func(r rune) rune {
        if strings.IndexRune(chr, r) < 0 {
            return r
        }
        return -1
    }, str)
}

因此,只需在此处将chr替换为" ",就足以完成任务并删除空格。
要注意还有其他类型的由unicode定义的空格(如换行符、nbsp、...),您可能还希望摆脱这些空格(特别是如果您正在处理您实际上无法控制的外部数据)
这将以这种方式完成:

func stripSpaces(str string) string {
    return strings.Map(func(r rune) rune {
        if unicode.IsSpace(r) {
            // if the character is a space, drop it
            return -1
        }
        // else keep it in the string
        return r
    }, str)
}

然后简单地应用到你的字符串。希望它能起作用,没有测试。

btqmn9zl

btqmn9zl4#

我想这是因为几年前有人问过这个问题:

strings.TrimSpace(moo)

TrimSpace返回字符串s的一个片段,其中删除了所有前导和尾随白色,如Unicode所定义。
参见https://pkg.go.dev/strings#TrimSpace

相关问题