假设我要从字符串中提取所有数字(最有可能使用正则表达式匹配),并且还希望将这些数字匹配替换为通用占位符,例如“#”。

使用FindAll,然后使用ReplaceAll,很容易分为两部分。但是,我对执行此类操作的性能成本有严重的怀疑。

所以拿一个弦

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

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

并 slice
[3.2,6.0,8.9]

以最高效的方式。

编辑:我实现了regexp.FindAllString + regexp.ReplaceAllString,对我的应用程序的性能影响很小。我希望我会尝试Elliot Chance的方法,并在有时间的时候将两者进行比较。

最佳答案

如果您需要原始性能,那么即使使用regexp还是很方便的,它很少是实现它的方法。逐个 token 地迭代 token 应该很快。一些代码:

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

我确定可以在其中进行更多优化,但这是我要采用的一般方法。

关于regex - 是否可以在Golang中的一次操作中提取字符串的一部分并替换这些部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43810523/

10-12 14:42