我想实现一个正则表达式来提取最后一个点之后的子字符串。 例如,
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"
也就是说,如果字符串包含点,它将删除不带点的最后一部分;如果字符串不包含点,它将返回“”。
答案 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"
如果要在输入没有点的情况下返回空字符串,则可以将ifelse
与grepl
一起使用:
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"