是否可以在Golang的一个操作中提取弦的一部分并替换这些零件



说我想从字符串中提取所有数字(最有可能使用正则匹配(,我也想用"#"。

这很容易使用Findall在两部分中完成,然后更换。但是,我对执行此类操作的绩效成本有严重的疑问。

所以拿一个字符串

"sdasd 3.2% sadas 6 ... +8.9"

替换
"sdasd #% sadas # ... +#"

并获得切片

[3.2,6.0,8.9]

以最具性能的方式。

编辑:我实现了Regexp.FindallString Regexp.ReplaceAllString,并且对我的应用程序的性能命中非常小。希望我会尝试Elliot Chance的方法,并在我有时间的时候进行比较。

如果您需要原始性能,而不是Regexp,即使是方便的,也很少是实现它的方法。令牌的迭代令牌应该很快。一些代码:

input := "sdasd 3.2 sadas 6"
output := []string{}
numbers := []float64{}
for _, tok := range strings.Split(input, " ") {
    if f, err := strconv.ParseFloat(tok, 64); err == nil {
        numbers = append(numbers, f)
        tok = "#"
    }
    output = append(output, tok)
}
finalString := strings.Join(output, " ")
fmt.Println(finalString, numbers)

游乐场链接

我敢肯定,那里还有更多的优化,但这是我采用的一般方法。

永远不要低估正则强度,尤其是GO的RE2引擎。

,也从来没有,永远不要在没有基准测试的情况下采用任何关于性能的事情。总是很惊讶。

正则表达式通常被编译和缓存。可以肯定的是,您可以先对其进行编译。

最新更新