正则表达式捕获组只捕获最后一次出现
Regex capturing group only capturing last occurence
这是我的输入:
start
@var=somevar1
@var=somevar2
end
我正在使用这个正则表达式
start(?:\s*\n*(?:@var=(.*)\s*)*)\s*\n*end
它的输出应该是
somevar1
somevar2
但它只给出了一些 var2。
有什么办法可以得到捕获组的所有出现吗?
一个选项是使用带有无限量词的正后视来断言开始,然后在左侧换行。
(?<=^start\n[^]*@var=)\S+(?=[^]*\nend$)
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
这是我的输入:
start
@var=somevar1
@var=somevar2
end
我正在使用这个正则表达式
start(?:\s*\n*(?:@var=(.*)\s*)*)\s*\n*end
它的输出应该是
somevar1
somevar2
但它只给出了一些 var2。
有什么办法可以得到捕获组的所有出现吗?
一个选项是使用带有无限量词的正后视来断言开始,然后在左侧换行。
(?<=^start\n[^]*@var=)\S+(?=[^]*\nend$)
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