第 2 次出现之间的 REGEX PCRE 字符

REGEX PCRE characters between 2 nth occurrences

我有类似于以下结构的数据。我需要提取第三次出现 "May 2016" 和 "Jun 2016".

之间的数据

我有以下模式(坦率地说)构造不正确(并且它没有带回我想要的字符)。

(.*(?>May 2016)){3}(.*(?=Jun 2016)){3}/s

我是 Regex 的新手,请问谁能帮我正确的表达。

May 2016 ef Jun 2016 efef May 2016 Jun 2016 May 2016

dffdg def efef

Jun 2016

May 2016

Jun 2016

如果可以假设 "May 2016" 和 "Jun 2016" 交替出现并且前者在前,那么

x <- "May 2016 A Jun 2016 B May 2016 Jun 2016 May 2016 C Jun 2016 May 2016 Jun 2016"
sub("(.*?May 2016.*?Jun 2016){2}.*?May 2016(.*?)Jun 2016.*", "\2", x)
[1] " C "

给你(这个需要perl = TRUE):

(?s)(?:.*?May 2016){3}\K.*?(?=Jun 2016)

Demo

解释:

  • (?s)激活单行选项
  • (?:.*?May 2016){3} 匹配 May 2016 3 次,中间有随机文本
  • \K 从匹配值
  • 中丢弃到目前为止匹配的内容
  • .*? 匹配任何东西
  • (?=Jun 2016) ...直到第一次出现 Jun 2016

几种方式

tt <- readLines(textConnection("May 2016 ef Jun 2016 efef May 2016 Jun 2016 May 2016

dffdg def efef

Jun 2016

May 2016

Jun 2016"))

(tt <- paste0(tt, collapse = ''))
# [1] "May 2016 ef Jun 2016 efef May 2016 Jun 2016 May 2016dffdg def efefJun 2016May 2016Jun 2016"


m <- gregexpr('May 2016(.*?)Jun 2016', tt, perl = TRUE)
mapply(function(x, y) substr(tt, x, x + y - 1),
       attr(m[[1]], 'capture.start'), attr(m[[1]], 'capture.length'))[3]
# [1] "dffdg def efef"


gsub('May.*May.*May 2016(.*?)Jun 2016.*', '\1', tt)
# [1] "dffdg def efef"