3 回答
TA贡献1804条经验 获得超2个赞
字符串切片!
in := "AA-BB-CC-DD-EE"
afterDash := strings.Index(in, "-") + 1
fmt.Println(in[:afterDash] + strings.Replace(in[afterDash:], "-", "", -1))
(在输入没有破折号的情况下,可能需要进行一些调整才能获得所需的行为)。
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))
}
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。
- 3 回答
- 0 关注
- 192 浏览
添加回答
举报