Diğer bir alternatif ise, normal ifade işlevleriyle alt ifadelerin yakalanmasını kullanmaktır regmatchesve regexec.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Bu, tüm dizeyi, ilk karakteri ve "popped" sonucunu 1 uzunluğunda bir liste olarak döndürür.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
eşdeğer olan list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). Yani, istenen öğelerin süper kümesini ve tam dizeyi içerir.
Ekleme sapply, bu yöntemin uzunluğu> 1 olan bir karakter vektörü için çalışmasına izin verecektir.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Bu, ilk öğe olarak eşleşen tam dizeye ()ve aşağıdaki öğeler olarak yakalanan eşleşen alt ifadelere sahip bir liste döndürür . Normal ifadede Yani '(^.)(.*)', (^.)ilk karakterle eşleşir ve (.*)kalan karakterler eşleşir.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Şimdi, istenen alt dizeleri çıkarmak için trusty sapply+ [yöntemini kullanabiliriz.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"