5

我有一个grep困惑我:我想删除字符串集合中最后一个句点之后的文本(我使用的是 R,所以perl语法可用)。

例如,假设字符串是ABCD.txtthisgrep将返回ABCD,如果文本是abc.com.foo.bar,它将返回abc.com.foo

非常感谢任何帮助(我认为我不能再喝咖啡了!)。

4

4 回答 4

10

以下是一些解决方案:

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"

添加。关于您要求删除前导句点的评论,最简单的方法是将其输入上述任何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" 
于 2013-07-25T01:01:51.603 回答
3

无缘无故的非正则表达式答案:

test <- c("abc.com.foo.bar","ABCD.txt")
sapply(strsplit(test,"\\."), function(x) paste0(head(x,-1),collapse=".") )
#[1] "abc.com.foo" "ABCD"
于 2013-07-25T01:58:57.373 回答
2

例如,您可以sub像这样使用:

sub('(.*)[.](.*)','\\1',c('abc.com.foo.bar','ABCD.txt'))
[1] "abc.com.foo" "ABCD"  
于 2013-07-25T00:58:48.727 回答
1

我无法用 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

正则表达式的语法相当普遍,所以我相信你可以采用它(也许只是摆脱/

于 2013-07-25T01:17:45.080 回答