代码之家  ›  专栏  ›  技术社区  ›  Alexander

删除最后一个空格之前的所有内容

  •  3
  • Alexander  · 技术社区  · 6 年前

    我有以下字符串。我试图删除最后一个空格之前的所有字符串,但似乎无法实现。

    我试着关注这个帖子

    Use gsub remove all string before first white space in R

    str <- c("Veni vidi vici")
    
    
    gsub("\\s*","\\1",str)
    
    "Venividivici"
    

    我想要的只是 "vici" 删除最后一个空格之前的所有内容后剩下的字符串。

    1 回复  |  直到 5 年前
        1
  •  11
  •   Wiktor Stribiżew    6 年前

    你的 gsub("\\s*","\\1",str) 代码使用对捕获组#1值的引用来替换每次出现的0个或多个空格(该值是一个空字符串,因为您尚未在模式中指定任何捕获组)。

    要匹配到最后一个空格:

    sub(".*\\s", "", str)
    

    如果不希望在字符串后面有空格的情况下得到空白结果,请先修剪字符串:

    sub(".*\\s", "", trimws(str))
    

    或者,使用方便的 stri_extract_last_regex from stringi package 用一个简单的 \S+ 模式(匹配1个或多个非空白字符):

    library(stringi)
    stri_extract_last_regex(str, "\\S+")
    # => [1] "vici"
    

    请注意 .* 尽可能多地匹配任何0个以上字符(自 * 是一个贪婪的量词 . 在TRE模式中,匹配任何字符(包括换行符),并首先获取整个字符串。然后,由于正则表达式引擎需要将空格与 \s 。正则表达式引擎从字符串的末尾逐字符生成,偶然发现最后一个空格,并将其称为“一天”,返回随后删除的匹配项。

    请参见 R demo 和a regex demo 在线:

    str <- c("Veni vidi vici")
    gsub(".*\\s", "", str)
    ## => [1] "vici"
    

    此外,您可能希望了解回溯在 regex debugger :

    enter image description here

    这些红色箭头显示回溯步骤。