The regex below uses two positive lookaheads and a positive lookbehind to split the string at the desired locations without consuming any characters. The map at the end breaks the result up into a list containing each @name and its associated strings.
library(tidyverse)
x = "@name37:51BLA BLA@othername38:00BLA@otherothername"
xs = str_split(x, "(?=@)|(?=\\d{2}:\\d{2})|(?<=\\d{2}:\\d{2})", simplify=TRUE) %>%
{.[.!=""]}
map(seq(1,length(xs), 3), ~xs[.x:(.x+2)])
#> [[1]]
#> [1] "@name" "37:51" "BLA BLA"
#>
#> [[2]]
#> [1] "@othername" "38:00" "BLA"
#>
#> [[3]]
#> [1] "@otherothername" NA NA
Created on 2020-10-25 by the reprex package (v0.3.0)
If you want a data frame, you can do:
map_df(seq(1,length(xs), 3), ~xs[.x:(.x+2)] %>%
set_names("name", "time", "text"))
name time text
<chr> <chr> <chr>
1 @name 37:51 BLA BLA
2 @othername 38:00 BLA
3 @otherothername NA NA