【问题标题】:R: Find the last dot in a stringR:查找字符串中的最后一个点
【发布时间】:2011-07-10 00:54:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex r


    【解决方案1】:

    这对你有用吗?

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

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

    【讨论】:

    • 一个'.'匹配每个可能的字符,以匹配文字 '.'你需要用'\'转义它,不幸的是,你需要用另一个'\'转义这个'\'。所以最后你的表达式看起来像'\\.'
    【解决方案2】:

    稍微改进一下语法怎么样?

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

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

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

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

    还有另一个更简洁的选项来使用tail:

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

    【讨论】:

    • 还有 9 条路要走,但我只想说:光滑。
    【解决方案3】:

    有人发布了以下我非常喜欢的答案,但我注意到他们已将其删除:

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

    我喜欢它,因为它直接生成所需的位置,而无需搜索结果。正则表达式也相当干净,这在正则表达式方面有点例外:)

    【讨论】:

    • 是的,就是我。我认为以前的解决方案有效,所以我将其删除。也许我不应该有:)
    【解决方案4】:

    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]
    

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      相关资源
      最近更新 更多