【问题标题】:Regex capturing group only capturing last occurence正则表达式捕获组仅捕获最后一次出现
【发布时间】:2020-12-16 11:54:00
【问题描述】:

这是我的输入:

start

        @var=somevar1
        @var=somevar2

end

我正在使用这个正则表达式

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

它的输出应该是

somevar1
somevar2

但它只给了 somevar2。

有什么方法可以获取所有捕获组的出现吗?

【问题讨论】:

  • 您可以使用两阶段方法,因此首先获取startend 之间的文本,然后匹配您的@ 字符串。
  • 您也可以在后视中使用无限量词,即 https://regex101.com/r/9uzpYD/1 得到更多支持 (?<=^start\s[^]*@var=)\S+

标签: javascript regex regex-group regex-greedy


【解决方案1】:

一种选择是使用带有无限量词的正向lookbehind来断言开始,然后在左侧换行。

请参阅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

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 2016-04-25
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多