R:找到字符串中的最后一个点

时间:2011-03-07 00:54:55

标签: regex r

在R中,是否有比下面找到字符串中最后一个点的位置更好/更简单的方法?

x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)]  # returns 16

这会找到字符串中的所有点,然后返回最后一个点,但它看起来很笨拙。我尝试使用正则表达式,但没有走得太远。

4 个答案:

答案 0 :(得分:61)

这对你有用吗?

x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
  • \.匹配点
  • [^\.]匹配除点
  • 之外的所有内容
  • *指定前一个表达式(除了点之外的所有内容)可能出现在0到无限次之间
  • $标记字符串的结尾。

把所有东西放在一起:找到一个点,后跟除了点之外的任何东西,直到字符串结束。 R要求转义\,因此在上面的表达式中\\。请参阅regex101.com以试用正则表达式。

答案 1 :(得分:28)

小语法改进怎么样?

这适用于输入向量长度为​​1的文字示例。使用escapes获取文字“。”搜索并反转结果以将最后一个索引作为“第一个”:

 rev(gregexpr("\\.", x)[[1]])[1]

更合适的矢量化版本(如果x长于1):

 sapply(gregexpr("\\.", x), function(x) rev(x)[1])

另一个使用tail的更整洁的选项:

sapply(gregexpr("\\.", x), tail, 1)

答案 2 :(得分:6)

有人发布了我真正喜欢的以下答案,但我注意到他们删除了它:

regexpr("\\.[^\\.]*$", x)

我喜欢它,因为它可以直接生成所需的位置,而无需搜索结果。正则表达式也相当干净,这与regexp有关是一个例外:)

答案 3 :(得分:1)

stringi软件包中有一个漂亮的stri_locate_last函数,可以接受文字字符串和正则表达式。

只需找到一个点,就不需要正则表达式了,它就像

stringi::stri_locate_last_fixed(x, ".")[,1]

如果您需要将此函数与正则表达式一起使用,以查找字符串中最后一个正则表达式匹配项的位置,则应将_fixed替换为_regex

stringi::stri_locate_last_regex(x, "\\.")[,1]

注意 .是一个特殊的正则表达式元字符,在正则表达式中用于匹配文字点字符时应转义。

查看R demo online

x <- "hello.world.123.456"
stringi::stri_locate_last_fixed(x, ".")[,1]
stringi::stri_locate_last_regex(x, "\\.")[,1]