我想实现一个正则表达式来提取最后一个点之后的子字符串。例如,
a = c("a.b.c.d", "e.b.e", "c", "f.d.e", "a.e.b.g.z")
gsub(".*(\\..*)$", "\\1", a)
Run Code Online (Sandbox Code Playgroud)
代码返回
".d" ".e" "c" ".e" ".z"
Run Code Online (Sandbox Code Playgroud)
如何修改代码才能得到
"d" "e" "" "e" "z"
Run Code Online (Sandbox Code Playgroud)
也就是说,如果字符串中包含点,则会去掉最后不带点的部分;如果字符串不包含点,则返回“”。
这是一种不使用捕获组来执行此操作的方法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"
Run Code Online (Sandbox Code Playgroud)
如果你想在输入没有点的情况下返回空字符串,那么我们可以使用ifelsewith grepl:
input <- "Hello World!"
output <- ifelse(grepl("\\.", input), sub(".*\\.", "", input), "")
Run Code Online (Sandbox Code Playgroud)
上面代码冗长的原因是,sub默认情况下,如果找不到匹配项,则仅返回原始字符串。但是,就您而言,您想要不同的行为。