4

Lets say I have a string:

StringA/StringB/StringC

Is there any way I can split this string by the / symbol, but keep it in the returned values:

StringA
/StringB
/StringC
Maël
  • 45,206
  • 3
  • 29
  • 67
jackahall
  • 400
  • 1
  • 7

3 Answers3

6

Yes, with a look-ahead: (?=/)

library(stringr)
str_split(str, "(?=/)")

#[[1]]
#[1] "StringA"  "/StringB" "/StringC"

Works equally well with tidyr separating function:

tidyr::separate_rows(data.frame(str), str, sep = "(?=/)")

#  str        
#1 StringA 
#2 /StringB
#3 /StringC

With base R's strsplit, look-aheads are less straightforwards, but this works well:

unlist(strsplit(str, "(?<=.)(?=[/])", perl = TRUE))
#[1] "StringA"  "/StringB" "/StringC"

And reversely:

unlist(strsplit(str, "(?<=/)", perl = TRUE))
#[1] "StringA/" "StringB/" "StringC" 
Maël
  • 45,206
  • 3
  • 29
  • 67
4

You can try scan + gsub like below

> scan(text = gsub("/", " /", "StringA/StringB/StringC"), what = "")
Read 3 items
[1] "StringA"  "/StringB" "/StringC"
ThomasIsCoding
  • 96,636
  • 9
  • 24
  • 81
1

With str_extract

library(stringr)
str_extract_all(str1, "/?[^/]+")[[1]]
[1] "StringA"  "/StringB" "/StringC"
akrun
  • 874,273
  • 37
  • 540
  • 662