【发布时间】:2013-07-25 00:46:56
【问题描述】:
我遇到了一个grep 难题:我想删除字符串集合中最后一个句点之后的文本(我使用的是R,所以perl 语法可用)。
例如,假设字符串为ABCD.txt,则此grep 将返回ABCD,如果文本为abc.com.foo.bar,则将返回abc.com.foo。
非常感谢任何帮助(我认为我不能再喝咖啡了!)。
【问题讨论】:
我遇到了一个grep 难题:我想删除字符串集合中最后一个句点之后的文本(我使用的是R,所以perl 语法可用)。
例如,假设字符串为ABCD.txt,则此grep 将返回ABCD,如果文本为abc.com.foo.bar,则将返回abc.com.foo。
非常感谢任何帮助(我认为我不能再喝咖啡了!)。
【问题讨论】:
这里有一些解决方案:
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"
【讨论】:
.vimrc 就变成了vimrc? (对不起,直到你解决了我的主要问题,我才意识到这个案例)。
^之后添加\\.。
abc.foo.bar (#2) 来展示一个例子?这绝对不是 OP 想要的(实际上它对每个人都没用)
无缘无故的非正则表达式答案:
test <- c("abc.com.foo.bar","ABCD.txt")
sapply(strsplit(test,"\\."), function(x) paste0(head(x,-1),collapse=".") )
#[1] "abc.com.foo" "ABCD"
【讨论】:
"\\." 是一个正则表达式。使用 strsplit(test, ".", fixed = TRUE) 将是一个非正则表达式解决方案。
您可以像这样使用sub:
sub('(.*)[.](.*)','\\1',c('abc.com.foo.bar','ABCD.txt'))
[1] "abc.com.foo" "ABCD"
【讨论】:
我无法在 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
正则表达式的语法相当普遍,所以我相信你可以采用它(也许只是摆脱/)
【讨论】: