Вот еще один подход, использующий только sub
:
a <- c("Bob/7", "What is this?", "Seventeen", "AA 1", "AA 7", " AA 7")
sub("(.*?[/ ]|).*", "\\1", a)
# [1] "Bob/" "What " "" "AA " "AA " " "
Итак, здесь .*?[/ ]
- это почти то же, что вы имели: я заменил +
на *
для случаев, подобных последнему вмой a
вектор.Затем |
соответствует ИЛИ, так что a|b
соответствует a
или b
.Теперь наличие .*?[/ ]|
соответствует тому, что мы хотим, или, если этого не было, мы сопоставляем пустую строку ""
.Без него мы получили бы:
sub("(.*?[/ ]).*", "\\1", a)
# [1] "Bob/" "What " "Seventeen" "AA " "AA " " "
А именно, с Seventeen
ничего не поделаешь, поэтому он остался неизменным, а при реальном решении мы заменили его пустой строкой.