在最后一个点之后提取子字符串

时间:2019-01-15 01:33:27

标签: r regex

我想实现一个正则表达式来提取最后一个点之后的子字符串。 例如,

a = c("a.b.c.d", "e.b.e", "c", "f.d.e", "a.e.b.g.z")
gsub(".*(\\..*)$", "\\1", a)

代码返回

".d" ".e" "c"  ".e" ".z"

如何修改代码以获取

"d" "e" ""  "e" "z"

也就是说,如果字符串包含点,它将删除不带点的最后一部分;如果字符串不包含点,它将返回“”。

2 个答案:

答案 0 :(得分:4)

这是使用sub而不使用捕获组的一种方法。我们可以尝试用空字符串替换直到最后一个点的所有内容。

a = c("a.b.c.d", "e.b.e", "c", "f.d.e", "a.e.b.g.z")
sub(".*\\.", "", a)

[1] "d" "e" "c" "e" "z"

如果要在输入没有点的情况下返回空字符串,则可以将ifelsegrepl一起使用:

input <- "Hello World!"
output <- ifelse(grepl("\\.", input), sub(".*\\.", "", input), "")

上面的代码冗长的原因是,sub默认情况下只会在找不到匹配项的情况下返回原始字符串。但是,根据您的情况,您想要一种不同的行为。

答案 1 :(得分:2)

您不需要.,而无需在捕获组之外

sub(".*\\.(.*)", "\\1", a)
#[1] "d" "e" "c" "e" "z"

这将捕获最后一个点之后的所有内容。

对于没有点的字符串,我们可以使用grepl进行检查,然后提取

ifelse(grepl("\\.", a), sub(".*\\.(.*)", "\\1", a), "")
#[1] "d" "e" ""  "e" "z"