猿问

从 strings.Replace() Golang 反向返回

我有一个很大的数据集,我需要在其中进行一些字符串操作(我知道字符串是不可变的)。包中的Replace()函数strings正是我所需要的,只是我需要它反向搜索。


说我有这个字符串: AA-BB-CC-DD-EE


运行这个脚本:


package main


import (

"fmt"

"strings"

)


func main() {

    fmt.Println(strings.Replace("AA-BB-CC-DD-EE", "-", "", 1))

}

它输出: AABB-CC-DD-EE


我需要的是:AA-BBCCDDEE,找到搜索键的第一个实例,其余的丢弃。


拆分字符串,插入破折号,然后将其重新连接在一起即可。但是,我认为有一种更高效的方法可以实现这一目标。


有只小跳蛙
浏览 193回答 3
3回答

慕婉清6462132

字符串切片!in := "AA-BB-CC-DD-EE"afterDash := strings.Index(in, "-") + 1fmt.Println(in[:afterDash] + strings.Replace(in[afterDash:], "-", "", -1))(在输入没有破折号的情况下,可能需要进行一些调整才能获得所需的行为)。

MMMHUHU

这可以是另一种解决方案package mainimport (    "strings"    "fmt")func Reverse(s string) string {    n := len(s)    runes := make([]rune, n)    for _, rune := range s {        n--        runes[n] = rune    }    return string(runes[n:])}func main() {    S := "AA-BB-CC-DD-EE"    S = Reverse(strings.Replace(Reverse(S), "-", "", strings.Count(S, "-")-1))    fmt.Println(S)}另一种解决方案:package mainimport (    "fmt"    "strings")func main() {    S := strings.Replace("AA-BB-CC-DD-EE", "-", "*", 1)    S = strings.Replace(S, "-", "", -1)    fmt.Println(strings.Replace( S, "*", "-", 1))}

守候你守候我

我认为你想使用strings.Map而不是用功能组合来操纵东西。它基本上适用于这种情况:具有比Replace表亲可以处理的更复杂要求的字符替换。定义:Map 返回字符串 s 的副本,根据映射函数修改其所有字符。如果映射返回负值,则从字符串中删除该字符而不进行替换。你的映射函数可以用一个相当简单的闭包来构建:func makeReplaceFn(toReplace rune, skipCount int) func(rune) rune {&nbsp; &nbsp; count := 0&nbsp; &nbsp; return func(r rune) rune {&nbsp; &nbsp; &nbsp; &nbsp; if r == toReplace && count < skipCount {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count++&nbsp; &nbsp; &nbsp; &nbsp; } else if r == toReplace && count >= skipCount {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return -1&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return r&nbsp; &nbsp; }}从那里开始,这是一个非常简单的程序:strings.Map(makeReplaceFn('-', 1), "AA-BB-CC-DD-EE")Playground,这会产生所需的输出:AA-BBCCDE程序退出。我不确定这是否比没有基准测试的其他解决方案更快或更慢,因为一方面它必须为字符串中的每个符文调用一个函数,而另一方面它不必转换(因此复制) 之间的[]byte/[]rune和string每个函数调用之间(尽管 hobbs 的 subslicing 答案可能总体上是最好的)。此外,该方法可以很容易地适应其他场景(例如保留每隔一个破折号),但需要注意的是strings.Map只能进行符文到符文的映射,而不能像那样进行符文到字符串的映射strings.Replace。
随时随地看视频慕课网APP

相关分类

Go
我要回答