【问题标题】:remove text after final period in string在字符串的最后一个句点之后删除文本
【发布时间】:2013-07-25 00:46:56
【问题描述】:

我遇到了一个grep 难题:我想删除字符串集合中最后一个句点之后的文本(我使用的是R,所以perl 语法可用)。

例如,假设字符串为ABCD.txt,则此grep 将返回ABCD,如果文本为abc.com.foo.bar,则将返回abc.com.foo

非常感谢任何帮助(我认为我不能再喝咖啡了!)。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    这里有一些解决方案:

    sub("^(.*)[.].*", "\\1", "abc.com.foo.bar") # 1
    ## [1] "abc.com.foo"
    
    library(tools)
    file_path_sans_ext("abc.com.foo.bar") # 3
    ## [1] "abc.com.foo"
    

    已添加。关于您要求删除前导句点的评论,最简单的方法是将其输入到上述任何x 是输入字符串的地方:

    sub("^[.]*", "", x)
    

    在一行中完成其中任何一项:

    x <- c("abc.com.foo.bar", ".abc.com.foo.bar", ".vimrc")
    
    sub("^[.]*(.*)[.]?.*$", "\\1", x) # 1a
    ## [1] "abc.com.foo.bar" "abc.com.foo.bar" "vimrc"          
    
    file_path_sans_ext(sub("^[.]*", "", x))
    ## [1] "abc.com.foo" "abc.com.foo" "vimrc" 
    

    【讨论】:

    • 要求一个同时修剪前导句点的版本是不是太过分了?这样.vimrc 就变成了vimrc? (对不起,直到你解决了我的主要问题,我才意识到这个案例)。
    • ^之后添加\\.
    • @G.Grothendieck:感谢您再次有机会为您的有见地的贡献投票。通过您在 Rhelp 上的许多帖子,您教会了我关于 R-regex 的大部分知识。
    • @Justin -- 非常感谢。现在完美地工作。希望我早点问。
    • 你为什么用abc.foo.bar (#2) 来展示一个例子?这绝对不是 OP 想要的(实际上它对每个人都没用)
    【解决方案2】:

    无缘无故的非正则表达式答案:

    test <- c("abc.com.foo.bar","ABCD.txt")
    sapply(strsplit(test,"\\."), function(x) paste0(head(x,-1),collapse=".") )
    #[1] "abc.com.foo" "ABCD"
    

    【讨论】:

    • 为了完全准确,这是一个更简单的正则表达式而不是非正则表达式解决方案,因为"\\." 是一个正则表达式。使用 strsplit(test, ".", fixed = TRUE) 将是一个非正则表达式解决方案。
    【解决方案3】:

    您可以像这样使用sub

    sub('(.*)[.](.*)','\\1',c('abc.com.foo.bar','ABCD.txt'))
    [1] "abc.com.foo" "ABCD"  
    

    【讨论】:

      【解决方案4】:

      我无法在 r 方面为您提供帮助,而且我几乎忘记了 perl,但这适用于 JS (proof) 和 PHP

      /\.[A-Za-z]+$/     -->    replace this with empty string ""
        ^    ^    ^
        |    |    |
        |    |    end of line
        |    only chars (you can add 0-9 if numbers are also present)
        dot before last chars
      

      正则表达式的语法相当普遍,所以我相信你可以采用它(也许只是摆脱/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 2023-03-21
        • 2020-03-12
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多