R 正则表达式捕获组?

Ste*_*veS 2 regex string r

我有很多这样的字符串:

2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0
Run Code Online (Sandbox Code Playgroud)

我想提取紧跟在最后一个"/"并以以下结尾的子字符串"_"

556662
Run Code Online (Sandbox Code Playgroud)

我已经找到了如何提取: /01/01/07/556662

通过使用以下正则表达式: (\/)(.*?)(?=\_)

请告知我如何捕获正确的组。

Wik*_*żew 5

您可以使用

x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式R 演示

在这里,正则表达式匹配并输出匹配的第一个子字符串

  • .*/ - 任何 0+ 个尽可能多的字符直到最后 /
  • \K - 从比赛中省略这部分
  • [^_]+- 将 1 个或多个字符_放入匹配值之外。

或者,一个sub解决方案:

sub(".*/([^_]+).*", "\\1", x)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

在这里,它与前一个类似,但 1 个或多个字符_捕获到组 1(\1在替换模式中)和尾随.*确保整个输入匹配(并消耗,准备被替换)。

替代的非基础 R 解决方案

如果您负担得起或愿意与之合作stringi,您可以使用

library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"
Run Code Online (Sandbox Code Playgroud)

这将匹配一个字符串直到最后一个/,并将捕获到第 1 组(您在第 2 列中使用 访问[,2])中的 1 个或多个字符,而不是_.

或者

stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"
Run Code Online (Sandbox Code Playgroud)

这将提取由 1 个或多个字符组成的字符串的最后一个匹配项,除了 a_/之后/