从字符串中删除最后一个句点后的文本。

5
我有一个关于grep的谜题让我困扰:我想要删除一组字符串中最后一个句号后面的文本(我正在使用R语言,所以可以使用perl语法)。
例如,如果字符串是ABCD.txt,这个grep将返回ABCD,如果文本是abc.com.foo.bar,它将返回abc.com.foo
非常感谢您的帮助(我觉得我再也不能喝咖啡了!)。
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" 

1
在“^”后添加“\。”。 - Justin
@G.Grothendieck:感谢您再次提供机会,让我能够点赞您深入的贡献。通过您在Rhelp上发布的众多帖子,您教会了我关于R-regex的大部分知识。 - IRTFM
为什么你要展示一个 abc.foo.bar (#2) 的例子呢?这明显不是 OP 想要的(实际上对于任何人来说都没用)。 - vladkras
sub("(.*[^.])[.][^.]+", "\\1", "abc.com.foo.bar"),我认为更易读。 - lcn
@Justin -- 我有另一个特殊情况:.abc.com ... 我想要返回 abc。这是否可能在一个正则表达式中实现?目前我正在使用两个正则表达式,并用 if 语句链接它们。 - ricardo
显示剩余3条评论

3

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

test <- c("abc.com.foo.bar","ABCD.txt")
sapply(strsplit(test,"\\."), function(x) paste0(head(x,-1),collapse=".") )
#[1] "abc.com.foo" "ABCD"

1
为了完全准确,这是一个比非正则表达式解决方案更简单的正则表达式,因为 "\\." 是一个正则表达式。使用 strsplit(test, ".", fixed = TRUE) 将是一个非正则表达式解决方案。 - G. Grothendieck

2

您可以像这样使用sub

sub('(.*)[.](.*)','\\1',c('abc.com.foo.bar','ABCD.txt'))
[1] "abc.com.foo" "ABCD"  

1

我不能帮助你处理R语言和Perl,但是这个方法可以在JS (proof) 和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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接