是否有可能提取字符串的一部分并在Golang中的一个操作中替换这些部分?

时间:2017-05-05 17:15:45

标签: regex performance go

假设我想从字符串中提取所有数字(最有可能使用正则表达式匹配),我还想将这些数字匹配替换为#34;#"等通用占位符。

使用FindAll,然后使用ReplaceAll,可以分两部分轻松完成。但是,我对执行此类操作的性能成本存在严重怀疑。

所以拿一个字符串

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

替换为

"sdasd #% sadas # ... +#"

并获得切片

[3.2,6.0,8.9]

以最高效的方式。

编辑:我实现了regexp.FindAllString + regexp.ReplaceAllString,我的应用程序的性能命中率非常低。我希望尝试Elliot Chance的方法,并在有空的时候比较两者。

2 个答案:

答案 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)

playground link

我确信在那里可以进行一些优化,但这是我采取的一般方法。

答案 1 :(得分:0)

永远不要低估正则表达式的力量,特别是Go的RE2引擎。

此外,在没有基准测试的情况下,永远不要假设有关性能的任何内容。总是令人惊喜。

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