正则表达式关键字后分组

时间:2019-12-03 15:09:11

标签: regex regex-group

我陷入了正则表达式问题。 范例文字

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.*?,)

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

使用任何正则表达式,至少支持See this demo at regex101来检查BAR不在前面。

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

capturing group(使用(*SKIP)(*F)提取部分直到逗号)


如果使用PCRE,可以使用(?m) flag跳过某些部分。

(?m)(?s:\A.*?^BAR)(*SKIP)(*F)|^data-key.*?,
  • dot(用于多行模式),以使插入符号与行首和美元行尾
  • 匹配
  • \A匹配字符串的开头
  • (?s:使用dotall标志启动一个非捕获组,以使See another demo at regex101匹配换行符

{{3}}

答案 1 :(得分:1)

除非您出于理论上的原因要求这样做,否则我建议您只将输入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);

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