【问题标题】:Remove everything before the last space删除最后一个空格之前的所有内容
【发布时间】:2018-05-14 18:55:02
【问题描述】:

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

我试着关注这篇文章

Use gsub remove all string before first white space in R

str <- c("Veni vidi vici")


gsub("\\s*","\\1",str)

"Venividivici"

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

【问题讨论】:

    标签: r regex gsub stringr


    【解决方案1】:

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

    你想匹配到最后一个空格:

    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 demoregex demo

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

    另外,您可能想看看regex debugger 中的回溯是如何工作的:

    那些红色箭头表示回溯步骤。

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2021-10-15
      • 2020-07-06
      • 2017-03-01
      • 2020-03-03
      • 2012-05-19
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多