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

标签 r regex gsub stringr

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

我试着关注这个帖子

Use gsub remove all string before first white space in R

str <- c("Veni vidi vici")


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

"Venividivici"

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

最佳答案

您的 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 demo和一个 regex demo在线的:
str <- c("Veni vidi vici")
gsub(".*\\s", "", str)
## => [1] "vici"

此外,您可能想在 regex debugger 中了解回溯是如何工作的。 :

enter image description here

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

关于删除最后一个空格之前的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50337189/

相关文章:

r - 更重要的数字

允许空格和句点的 Python scraper 正则表达式

regex - 正则表达式以匹配字符串的首次出现

c# - 如何使用 RegEx 替换字符串中所有不需要的字符?

regex - R中的模式匹配和替换

用 gsub 替换特殊字符

qt - Qt 4.8 支持哪些 OpenType GSUB 功能?

r - 如何检查列表是否包含 R 中的某个元素

r - 如何使用 dplyr 分组进行统计测试,然后用扫帚制作 tibble

javascript - Shiny 的 tabPanel 和 Google Analytics