说我想从字符串中提取所有数字(最有可能使用正则匹配(,我也想用"#"。
这很容易使用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引擎。
,也从来没有,永远不要在没有基准测试的情况下采用任何关于性能的事情。总是很惊讶。
正则表达式通常被编译和缓存。可以肯定的是,您可以先对其进行编译。