正则表达式捕获组仅捕获最后一次出现

问题描述

这是我的输入内容

start

        @var=somevar1
        @var=somevar2

end

我正在使用此正则表达式

start(?:\s*\n*(?:@var=(.*)\s*)*)\s*\n*end

它的输出应为

somevar1
somevar2

但它只给出somevar2。

有什么办法可以使捕获组全部出现吗?

解决方法

一种选择是在正后面加上一个inifite量词来断言start,然后在左边换行。

请参见support for lookbehinds

(?<=^start\n[^]*@var=)\S+(?=[^]*\nend$)

Regex demo

const regex = /(?<=^start\n[^]*@var=)\S+(?=[^]*\nend$)/gm;
const str = `start

        @var=somevar1
        @var=somevar2

end`;
let m;

console.log(str.match(regex));

如果前后只能有@ var = somevar的格式,而不是其他内容:

(?<=^start\n\s*(?:@var=\S+\s+)*@var=)\S+(?=(?:\s*@var=\S+)*\s*\nend$)

查看其他regex demo