我陷入了正则表达式问题。 范例文字
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.*?,)
有什么想法吗?
答案 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.*?,
\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);
这将为您提供所需的结果。