返回正则表达式中前一行的值



我希望通过regex返回前一行中的特定组。

假设我有以下信息,目标是在下一行的微分的基础上提取90的值。

QTY+66:90:PCE
SCC+2
DTM+45:20200416:15
QTY+66:60:PCE
SCC+3
DTM+35:20210614:2

如果我要遍历90的值,我必须查找SCC+2标记,如果我要查找60,它将是SCC+3标记。

我在尝试返回值90(?<=^QTY+66:)(d+)(.*n.*SCC+2.*)时走到了这一步,但这似乎很复杂,我无法仅提取组1。这是regex101的链接。我在实际应用中使用R。谢谢你的帮助!

您可以使用

(?<=:)d+(?=[^drn]*[rn]+.*SCC+2)

请参阅regex演示详细信息

  • (?<=:)-:必须立即出现在当前位置的左侧
  • d+-一个或多个数字
  • (?=[^drn]*[rn]+.*SCC+2)-右边必须有
  • [^drn]*-除数字、CR和LF之外的任何零个或多个字符
  • [rn]+-一个或多个CR或LF字符
  • .*SCC+2-一行中的任何文本,直到第三次出现SCC+2

在R中,您可以使用

library(stringr)
str_extract(vec, "(?<=:)\d+(?=[^\drn]*[rn]+.*SCC\+2)")

以及sub:的几种基本R方法

sub(".*?\+\d+:(\d+)[^rn]*[rn]+[^rn]*SCC\+2.*", "\1", vec)
sub("(?s).*?\+\d+:(\d+)(?-s).*\R.*SCC\+2(?s).*", "\1", vec, perl=TRUE)

请参阅regex 1演示和regex 2演示。

在线查看R演示:

vec <- "QTY+66:90:PCEnSCC+2nDTM+45:20200416:15nQTY+66:60:PCEnSCC+3nDTM+35:20210614:2"
sub(".*?\+\d+:(\d+)[^rn]*[rn]+[^rn]*SCC\+2.*", "\1", vec)
sub("(?s).*?\+\d+:(\d+)(?-s).*\R.*SCC\+2(?s).*", "\1", vec, perl=TRUE)
library(stringr)
str_extract(vec, "(?<=:)\d+(?=[^\drn]*[rn]+.*SCC\+2)")

均得到CCD_ 13。

最新更新