#string #go #split #substring #slice
#строка #Вперед #разделение #подстрока #фрагмент
Вопрос:
Я новичок в go и использую разделение в своих интересах. Недавно я столкнулся с проблемой, я хотел что-то разделить и сохранить разделяемый символ во втором фрагменте, а не удалять его или оставлять в первом фрагменте, как с SplitAfter.
Например, следующий код:
strings.Split("email@email.com", "@")
возвращено: ["email", "email.com"]
strings.SplitAfter("email@email.com", "@")
возвращено: ["email@", "email.com"]
Какой наилучший способ получить ["email", "@email.com"]
?
Комментарии:
1. Самым простым способом было бы просто «добавить» разделитель к каждому элементу возвращаемого фрагмента, кроме первого. play.golang.com/p/sA33rVeJjRt
2. То, что он сделал, было в основном тем же, что и я, но он дал вам хорошую функцию для использования.
Ответ №1:
Используйте строки.Проиндексируйте, чтобы найти @
, и разрежьте, чтобы получить две части:
var part1, part2 string
if i := strings.Index(s, "@"); i >= 0 {
part1, part2 = s[:i], s[i:]
} else {
// handle case with no @
}
Комментарии:
1. Используя ваше предложение, вот более полная реализация: play.golang.org/p/P4rZvBAuSih
Ответ №2:
Может ли это сработать для вас?
s := strings.Split("email@email.com", "@")
address, domain := s[0], "@" s[1]
fmt.Println(address, domain)
// email @email.com
Затем расчесывание и создание строки
var buffer bytes.Buffer
buffer.WriteString(address)
buffer.WriteString(domain)
result := buffer.String()
fmt.Println(result)
// email@email.com
Комментарии:
1. Код в этом ответе вызовет панику, если строка не содержит @ .
Ответ №3:
Вы можете использовать bufio.Scanner
:
package main
import (
"bufio"
"strings"
)
func email(data []byte, eof bool) (int, []byte, error) {
for i, b := range data {
if b == '@' {
if i > 0 {
return i, data[:i], nil
}
return len(data), data, nil
}
}
return 0, nil, nil
}
func main() {
s := bufio.NewScanner(strings.NewReader("email@email.com"))
s.Split(email)
for s.Scan() {
println(s.Text())
}
}