假设我想从字符串中提取所有数字(最有可能使用正则表达式匹配),我还想将这些数字匹配替换为#34;#"等通用占位符。
使用FindAll,然后使用ReplaceAll,可以分两部分轻松完成。但是,我对执行此类操作的性能成本存在严重怀疑。
所以拿一个字符串
"sdasd 3.2% sadas 6 ... +8.9"
替换为
"sdasd #% sadas # ... +#"
并获得切片
[3.2,6.0,8.9]
以最高效的方式。
编辑:我实现了regexp.FindAllString + regexp.ReplaceAllString,我的应用程序的性能命中率非常低。我希望尝试Elliot Chance的方法,并在有空的时候比较两者。
答案 0 :(得分:1)
如果您需要原始性能而不是正则表达式很少是实现它的方法,即使它很方便。通过令牌迭代令牌应该非常快。一些代码:
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)
我确信在那里可以进行一些优化,但这是我采取的一般方法。
答案 1 :(得分:0)
永远不要低估正则表达式的力量,特别是Go的RE2引擎。
此外,在没有基准测试的情况下,永远不要假设有关性能的任何内容。总是令人惊喜。
通常编译和缓存正则表达式。可以肯定的是,您可以先通过编译进行优化。