Regex 仅在选择组内匹配内容

Regex 仅在选择组内匹配内容,regex,Regex,我正在寻找一种方法来匹配一些内容,这些内容应该只存在于我的选择组中。比如,我有一个字符串文件,如下所示: 模块asdf(a、b、c、d、e); 输入a; 输入b; 输出c; 输出d; 输出e; 分配c=a; 端模 abc模块(p,q); 输入p; 输出q; 分配q=p+q; 端模 asdf模块(x,y); 输入x; 输出y; 分配y=x^y; 端模 模块xyz(l,m); 输入l; 输出m; 分配m=l-m; 端模 我想匹配模块asdf的所有输出端口的内容。这些输出端口的数量可能不同,但它们遵

我正在寻找一种方法来匹配一些内容,这些内容应该只存在于我的选择组中。比如,我有一个字符串文件,如下所示:

模块asdf(a、b、c、d、e);
输入a;
输入b;
输出c;
输出d;
输出e;
分配c=a;
端模
abc模块(p,q);
输入p;
输出q;
分配q=p+q;
端模
asdf模块(x,y);
输入x;
输出y;
分配y=x^y;
端模
模块xyz(l,m);
输入l;
输出m;
分配m=l-m;
端模
我想匹配模块asdf的所有输出端口的内容。这些输出端口的数量可能不同,但它们遵循相同的语法

我能够匹配整个模块asdf,如下所示:

(模块\s+asdf[\s\s]+?)(输入\s+[\s\s]+?)(输出\s+[\s]+?)结束模块
通过这个延迟匹配,以及输出端口,我还匹配了第3组中的assign语句

理想情况下,我希望匹配整个模块,如:

(module\s+asdf[\s\s]+?endmodule)
现在,在这个组中,我想进一步搜索。我知道,在编写脚本时,我们可以将整个模块的内容捕获到一个变量中,然后在下一步中重新搜索这些内容。但是,有没有一种方法可以在一次拍摄中搜索到一组被捕获的内容

是否有一种方法可以在捕获的reg ex组内进行搜索,只需一次

(module\s+asdf[\s\s]+?endmodule)
我们的期望是符合:

输出c;
输出d;
输出e;
输出y;

如果支持,您可以使用
\G
锚定在上一场比赛结束时确定位置,并在第一个捕获组中获得您的比赛:

(?:^module\s+asdf\b.*(?:\n+input.*)*\s+|\G)(output.*)\n+(?=(?:(?!(?:end)?module).*\n)*endmodule)
解释

  • (?:
    非捕获组
    • ^module\s+asdf\b.*(:\n+input.*)\s+
      从字符串开头匹配模块asdf中的部分,包括输入
    • |
    • \G
      在上一个匹配结束时断言位置
  • 关闭非捕获组
  • (输出。*)\n+
    在组1输出中捕获,直到字符串结束
  • (?=
    正向前瞻,断言右边的是
    • (?:(?!(?:结束)?模块)。*\n)*endmodule
      匹配endmodule,并确保字符串开头没有模块
  • 关闭正向前瞻

如果还支持
\K
,则可以获取匹配项而不是捕获组:

(?:^module\s+asdf\b.*(?:\n+input.*)*\s+|\G)\Koutput.*\n+(?=(?:(?!(?:end)?module).*\n)*endmodule)

您使用哪种工具或编程语言?在语言/脚本中,这不是问题。我想在Vim编辑器中找到一种方法。因为我需要以交互方式查看内容,以便手动编辑文件。