Одним из предложений является использование трубы, а также добавление и добавление []
.
reader := strings.NewReader(jsonStream)
pr, pw := io.Pipe()
go func() {
pw.Write([]byte(`[`))
io.Copy(pw, reader)
pw.Write([]byte(`]`))
}()
dec := json.NewDecoder(pr)
Вы должны добавить некоторую обработку ошибок.
См. https://play.golang.org/p/Oogu_NdAUyR для всего этого.
Попробуйте это:
(.+?)(\.[^.]*$|$)
Это будет:
Примечание: как комментатор j_random_hacker предложенный, это работает, как рекламируется, но Вы могли бы хотеть предшествовать вещам с привязкой в целях удобочитаемости.
Все сопровождаемое точкой, сопровождаемой одним или несколькими символами, это не точка, сопровождаемая к концу:
(.+?)\.[^\.]+$
everything-before-the-last-dot сгруппирован для легкого извлечения.
, Если Вы не на 100% уверены, каждый файл будет иметь расширение, попробовать:
(.+?)(\.[^\.]+$|$)
как насчет 2 получений один для конца и один для имени файла.
, например,
(.+?)(?:\.[^\.]*$|$)
Хорошо, я не уверен, почему я использовал бы регулярное выражение для этого. Если я знаю, например, что строка является полным filepath, то я использовал бы другой API для получения имени файла. Регулярные выражения очень мощны, но в то же время довольно сложны (Вы только что доказали это путем выяснения, как создать такой простой regex). Кто-то сказал: у Вас была проблема, что Вы решили решить ее с помощью регулярных выражений. Теперь у Вас есть две проблемы.
Думают снова. Если Вы находитесь на платформе.NET, например, то смотрите на Система. Класс IO.Path .