Một giải pháp thay thế khác là sử dụng bắt các biểu thức phụ với các hàm biểu thức chính quy regmatches
và regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Điều này trả về toàn bộ chuỗi, ký tự đầu tiên và kết quả "bật lên" trong danh sách có độ dài 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
tương đương với list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. Nghĩa là, nó chứa tập siêu các phần tử mong muốn cũng như chuỗi đầy đủ.
Việc thêm sapply
sẽ cho phép phương thức này hoạt động đối với vectơ ký tự có độ dài> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Điều này trả về một danh sách với chuỗi đầy đủ phù hợp làm phần tử đầu tiên và các biểu thức phụ phù hợp được ghi lại ()
dưới dạng các phần tử sau. Vì vậy, trong biểu thức chính quy '(^.)(.*)'
, (^.)
khớp với ký tự đầu tiên và (.*)
khớp với các ký tự còn lại.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Bây giờ, chúng ta có thể sử dụng phương thức trusty sapply
+ [
để lấy ra các chuỗi con mong muốn.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"