为了账号安全,请及时绑定邮箱和手机立即绑定

从 strings.Replace() Golang 反向返回

从 strings.Replace() Golang 反向返回

Go
有只小跳蛙 2021-11-15 20:57:53
我有一个很大的数据集,我需要在其中进行一些字符串操作(我知道字符串是不可变的)。包中的Replace()函数strings正是我所需要的,只是我需要它反向搜索。说我有这个字符串: AA-BB-CC-DD-EE运行这个脚本:package mainimport ("fmt""strings")func main() {    fmt.Println(strings.Replace("AA-BB-CC-DD-EE", "-", "", 1))}它输出: AABB-CC-DD-EE我需要的是:AA-BBCCDDEE,找到搜索键的第一个实例,其余的丢弃。拆分字符串,插入破折号,然后将其重新连接在一起即可。但是,我认为有一种更高效的方法可以实现这一目标。
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

字符串切片!


in := "AA-BB-CC-DD-EE"

afterDash := strings.Index(in, "-") + 1

fmt.Println(in[:afterDash] + strings.Replace(in[afterDash:], "-", "", -1))

(在输入没有破折号的情况下,可能需要进行一些调整才能获得所需的行为)。


查看完整回答
反对 回复 2021-11-15
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这可以是另一种解决方案


package main


import (

    "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 main


import (

    "fmt"

    "strings"

)


func main() {

    S := strings.Replace("AA-BB-CC-DD-EE", "-", "*", 1)

    S = strings.Replace(S, "-", "", -1)

    fmt.Println(strings.Replace( S, "*", "-", 1))

}


查看完整回答
反对 回复 2021-11-15
?
守候你守候我

TA贡献1802条经验 获得超10个赞

我认为你想使用strings.Map而不是用功能组合来操纵东西。它基本上适用于这种情况:具有比Replace表亲可以处理的更复杂要求的字符替换。定义:


Map 返回字符串 s 的副本,根据映射函数修改其所有字符。如果映射返回负值,则从字符串中删除该字符而不进行替换。


你的映射函数可以用一个相当简单的闭包来构建:


func makeReplaceFn(toReplace rune, skipCount int) func(rune) rune {

    count := 0

    return func(r rune) rune {

        if r == toReplace && count < skipCount {

            count++

        } else if r == toReplace && count >= skipCount {

            return -1

        }


        return r

    }

}

从那里开始,这是一个非常简单的程序:


strings.Map(makeReplaceFn('-', 1), "AA-BB-CC-DD-EE")

Playground,这会产生所需的输出:


AA-BBCCDE


程序退出。


我不确定这是否比没有基准测试的其他解决方案更快或更慢,因为一方面它必须为字符串中的每个符文调用一个函数,而另一方面它不必转换(因此复制) 之间的[]byte/[]rune和string每个函数调用之间(尽管 hobbs 的 subslicing 答案可能总体上是最好的)。


此外,该方法可以很容易地适应其他场景(例如保留每隔一个破折号),但需要注意的是strings.Map只能进行符文到符文的映射,而不能像那样进行符文到字符串的映射strings.Replace。


查看完整回答
反对 回复 2021-11-15
  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信