英文:
Splitting string in 2 parts by removing substring in golang
问题
我正在尝试解析类似于以下形式的字符串:
abc***********xyz
将其解析为一个切片(或两个变量)的"abc"和"xyz",并删除所有的星号。
星号的数量和两侧的字母都可以是可变的,所以长度不一定是固定的。我想知道Go语言是否有使用strings包来实现这个功能的好方法?
英文:
I'm trying to parse strings that look something like this:
abc***********xyz
into a slice (or 2 variables) of "abc" and "xyz", removing all the asterisks.
The number of *
can be variable and so can the letters on each side, so it's not necessarily a fixed length. I'm wondering if go has a nice way of doing this with the strings package?
答案1
得分: 3
使用strings.FieldsFunc函数,其中*
是字段分隔符。
s := "abc***********xyz"
z := strings.FieldsFunc(s, func(r rune) bool { return r == '*' })
fmt.Println(len(z), z) // 输出 2 [abc xyz]
在线示例。
英文:
Use strings.FieldsFunc where *
is a field separator.
s := "abc***********xyz"
z := strings.FieldsFunc(s, func(r rune) bool { return r == '*' })
fmt.Println(len(z), z) // prints 2 [abc xyz]
答案2
得分: 1
在任意数量的星号上进行分割:
words := regexp.MustCompile(`\*+`).Split(str, -1)
请参考实时演示。
英文:
Split on any number of asterisks:
words := regexp.MustCompile(`\*+`).Split(str, -1)
See live demo.
答案3
得分: 0
如果性能是一个问题,你可以使用这个函数:
func SplitAsteriks(s string) (result []string) {
if len(s) == 0 {
return
}
i1, i2 := 0, 0
for i := 0; i < len(s); i++ {
if s[i] == '*' && i1 == 0 {
i1 = i
}
if s[len(s)-i-1] == '*' && i2 == 0 {
i2 = len(s) - i
}
if i1 > 0 && i2 > 0 {
result = append(result, s[:i1], s[i2:])
return
}
}
result = append(result, s)
return
}
英文:
if performance is an issue, you can use this func:
func SplitAsteriks(s string) (result []string) {
if len(s) == 0 {
return
}
i1, i2 := 0, 0
for i := 0; i < len(s); i++ {
if s[i] == '*' && i1 == 0 {
i1 = i
}
if s[len(s)-i-1] == '*' && i2 == 0 {
i2 = len(s) - i
}
if i1 > 0 && i2 > 0 {
result = append(result, s[:i1], s[i2:])
return
}
}
result = append(result, s)
return
}
答案4
得分: 0
为了获得最佳性能,请编写一个for循环:
func SplitAsteriks(s string) []string {
var (
in bool // true表示在一个标记内部
tokens []string // 在这里收集函数的结果
i int
)
for j, r := range s {
if r == '*' {
if in {
// 从标记到分隔符的转换
tokens = append(tokens, s[i:j])
in = false
}
} else {
if !in {
// 从一个或多个分隔符到标记的转换
i = j
in = true
}
}
}
if in {
tokens = append(tokens, s[i:])
}
return tokens
}
英文:
For best performance, write a for loop:
func SplitAsteriks(s string) []string {
var (
in bool // true if inside a token
tokens []string // collect function result here
i int
)
for j, r := range s {
if r == '*' {
if in {
// transition from token to separator
tokens = append(tokens, s[i:j])
in = false
}
} else {
if !in {
// transition from one or more separators to token
i = j
in = true
}
}
}
if in {
tokens = append(tokens, s[i:])
}
return tokens
}
答案5
得分: 0
使用以下代码,假设字符串被指定为两部分:
s := "abc***********xyz"
p := s[:strings.IndexByte(s, '*')]
q := s[strings.LastIndexByte(s, '*')+1:]
fmt.Println(p, q) // 输出 abc xyz
这段代码的作用是将字符串 s
按照 *
分割成两部分,并打印出分割后的结果。其中 p
表示 *
前面的部分,q
表示 *
后面的部分。
英文:
Use this code given that the string is specified to have two parts:
s := "abc***********xyz"
p := s[:strings.IndexByte(s, '*')]
q := s[strings.LastIndexByte(s, '*')+1:]
fmt.Println(p, q) // prints abc xyz
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论