Удалить текст после последнего периода в строке

У меня есть 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

синтаксис регулярных выражений довольно распространен, поэтому я уверен, что вы можете принять его (возможно, просто избавиться от /)

Другие вопросы по тегам