【问题标题】:Return value from previous row in regex从正则表达式中的上一行返回值
【发布时间】:2022-01-23 06:29:43
【问题描述】:

我希望通过正则表达式返回上一行中的特定组。

假设我有以下信息,目标是根据下一行的微分提取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 用于实际应用程序。感谢您的帮助!

【问题讨论】:

  • 所以不用大张旗鼓,它只是.*YOURVALUE.*\r?\n.* 还是仅此而已?如果没有,那么您需要强调 value added highlight constants 以进行正确的分隔匹配。您的解释有很多漏洞并且不清楚,并且没有必要的细节来进行最简单的匹配。如果你说细节在那里,那么为什么这个问题既然已经回答了。

标签: regex


【解决方案1】:

你可以使用

(?<=:)\d+(?=[^\d\r\n]*[\r\n]+.*SCC\+2)

请参阅regex demo详情

  • (?&lt;=:) - : 必须紧邻当前位置的左侧
  • \d+ - 一位或多位数字
  • (?=[^\d\r\n]*[\r\n]+.*SCC\+2) - 紧靠右边,一定有
  • [^\d\r\n]* - 除数字、CR 和 LF 以外的任何零个或多个字符
  • [\r\n]+ - 一个或多个 CR 或 LF 字符
  • .*SCC\+2 - 一行中的任何文本,直到出现 SCC+2 为止。

在 R 中,你可以使用

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

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

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

请参阅 regex 1 demoregex 2 demo

R demo online

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

全部收益[1] "90"

【讨论】:

  • 感谢 Wiktor,我刚刚对其进行了测试,它在两种情况下都返回了前几行的值 66。我对其进行了一些修改,以采用 QTY+66: 左侧的加法:(?&lt;=QTY\+66\:)\d+(?=.*[\r\n]+.*SCC\+3)
  • @Max 查看我刚刚更新的代码sn -p。现在所有解决方案都返回90
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多