Удалить текст после последнего периода в строке
У меня есть grep
головоломка, которая ускользает от меня: я хотел бы удалить текст после последнего периода в коллекции строк (я использую R, так perl
синтаксис доступен).
Например, скажем, строка ABCD.txt
этот grep
вернется ABCD
и если текст был abc.com.foo.bar
, он бы вернулся abc.com.foo
,
Любая помощь с благодарностью (я не думаю, что я могу пить больше кофе!).
4 ответа
Вот несколько решений:
sub("^(.*)[.].*", "\\1", "abc.com.foo.bar") # 1
## [1] "abc.com.foo"
library(tools)
file_path_sans_ext("abc.com.foo.bar") # 3
## [1] "abc.com.foo"
ADDED. Что касается вашего комментария с просьбой удалить ведущие периоды, проще всего просто вставить это в любой из вышеперечисленных где x
это входная строка:
sub("^[.]*", "", x)
Чтобы сделать любой из них в одну строку:
x <- c("abc.com.foo.bar", ".abc.com.foo.bar", ".vimrc")
sub("^[.]*(.*)[.]?.*$", "\\1", x) # 1a
## [1] "abc.com.foo.bar" "abc.com.foo.bar" "vimrc"
file_path_sans_ext(sub("^[.]*", "", x))
## [1] "abc.com.foo" "abc.com.foo" "vimrc"
И не-регулярный ответ без всякой причины:
test <- c("abc.com.foo.bar","ABCD.txt")
sapply(strsplit(test,"\\."), function(x) paste0(head(x,-1),collapse=".") )
#[1] "abc.com.foo" "ABCD"
Ты можешь использовать sub
например вот так:
sub('(.*)[.](.*)','\\1',c('abc.com.foo.bar','ABCD.txt'))
[1] "abc.com.foo" "ABCD"
Я не могу помочь вам с r, и я почти забыл Perl, но это работает как в JS ( доказательство) и PHP
/\.[A-Za-z]+$/ --> replace this with empty string ""
^ ^ ^
| | |
| | end of line
| only chars (you can add 0-9 if numbers are also present)
dot before last chars
синтаксис регулярных выражений довольно распространен, поэтому я уверен, что вы можете принять его (возможно, просто избавиться от /
)