Разделение строки перед символом

#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())
   }
}
  

https://golang.org/pkg/bufio#Scanner.Разделение