关键字后的 RegEx 分组

RegEx Grouping after keyword

我被正则表达式问题困住了。 示例文本

data-key=foo1,
data-key=foo2,
data-key=foo3,
BAR,
data-key=foo4,
asd
data-key=foo5,
asfda
data-key=foo6,

我现在想要单词 "BAR" 之后的所有数据键行。 期望的结果:

data-key=foo4,
data-key=foo5,
data-key=foo6,

这个 RegEx 会给出我想要的结果,但我不想指定数据键行出现了多少次,因为它可以是任何数字:

(?s)BAR.*(data-key.*?,).*(data-key.*?,).*(data-key.*?,)

有什么想法吗?

除非您出于理论上的原因提出这个问题,否则我建议您将输入拆分为 BAR,然后对其后的所有内容执行正则表达式:

var str="data-key=foo1,\ndata-key=foo2,\ndata-key=foo3,\nBAR,\ndata-key=foo4,\nasd\ndata-key=foo5,\nasfda\ndata-key=foo6";

var regex = /(?:data-key=([^,]*))/ig;
 
var matches = Array.from(str.split("BAR,")[1].matchAll(regex));

console.log(matches);

这将为您提供所需的结果。

任何正则表达式风格至少支持 lookaheads 以检查 BAR 不领先。

(data-key[^,\n]*,).*(?![\s\S]*?\nBAR)

See this demo at regex101  (using a capturing group 提取逗号前的部分)


如果使用 PCRE,(*SKIP)(*F) 可以跳过某些部分。

(?m)(?s:\A.*?^BAR)(*SKIP)(*F)|^data-key.*?,
  • (?m) flag 对于多行模式,使插入符匹配 行开始 和美元 行结束
  • \A 匹配 字符串的开头
  • (?s: 使用 dotall 标志启动一个非 捕获组 以使 dot 匹配换行符

See another demo at regex101