繁体   English   中英

在R stringr中第n次出现后匹配

[英]match after nth occurrence in R stringr

如何在管道的第n次和第n + 1次匹配中匹配事物?

我想在字符串abc|def|ghi|jkl中匹配ghi

我最好的尝试是

str_match_all('abc|def|ghi|jkl', '((?<=\\|)[^|]*)')[2,1]

但这有点效率低下,因为它比我需要的要匹配的多,然后在R中将其削减到第二个匹配。 我想知道是否有更多的正则表达式可以只参加第n个比赛。

您可以使用

str_extract(x, "(?<=\\|)[^|]+(?=\\|[^|]+$)")
regmatches(x, regexpr("(?<=\\|)[^|]+(?=\\|[^|]+$)", x, perl=TRUE))
sub(".*\\|([^|]+)\\|[^|]+$", "\\1", x)

参见regex演示str_match / regmatches )和另一个演示sub )。

细节

  • (?<=\\\\|) -确保有一个| char立即位于当前位置的左侧
  • [^|]+ -除|以外的一个或多个字符
  • (?=\\\\|[^|]+$) -当前位置的右侧,必须有一个| char,然后除|以外的任何0+字符 然后是字符串的结尾。

R:

library(stringr)
x <- "abc|def|ghi|jkl"
str_extract(x, "(?<=\\|)[^|]+(?=\\|[^|]+$)")
## => [1] "ghi"
regmatches(x, regexpr("(?<=\\|)[^|]+(?=\\|[^|]+$)", x, perl=TRUE))
## => [1] "ghi"
sub(".*\\|([^|]+)\\|[^|]+$", "\\1", x)
## => [1] "ghi"

您是否正在寻找这样的东西? 应该捕获管道之间的所有内容。

r"(?<=\|)[^\|]*(?=\|)"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM