我有很多这样的字符串:
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
通过使用以下正则表达式: (\/)(.*?)(?=\_)
请告知我如何捕获正确的组。
您可以使用
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)
在这里,正则表达式匹配并输出匹配的第一个子字符串
.*/
- 任何 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_
和/
之后/
。