我正在寻找一种匹配某些内容的方法,该内容应该只存在于我的选择组中。说,我有一个像这样的字符串文件:
module asdf (a,b,c,d,e);
input a;
input b;
output c;
output d;
output e;
assign c = a;
endmodule
module abc (p,q);
input p;
output q;
assign q = p + q ;
endmodule
module asdf (x,y);
input x;
output y;
assign y = x ^ y ;
endmodule
module xyz (l,m);
input l;
output m;
assign m = l - m;
endmodule
我要匹配模块asdf的所有输出端口的内容。这些输出端口的数量可以不同,但是它们遵循相同的语法。
我能够匹配整个模块asdf,如下所示:
(module\s+asdf[\s\S]+?)(input\s+[\s\S]+?)(output\s+[\s\S]+?)endmodule
通过这种惰性匹配以及输出端口,我也匹配了第3组中的assign语句。
理想情况下,我想匹配整个模块,例如:
(module\s+asdf[\s\S]+?endmodule)
现在,在这个组中,我想进一步搜索。我知道在编写脚本时,我们可以将整个模块的内容捕获到一个变量中,然后在下一步中重新搜索这些内容。但是,有没有一种方法可以在一个捕获的组中一次搜索内容?
有一种方法可以一次捕获捕获的reg-ex组中的内容。
(module\s+asdf[\s\S]+?endmodule)
期望与之匹配:
output c;
output d;
output e;
output y;
答案 0 :(得分:1)
如果支持,则可以使用\G
锚点在上一个比赛的末尾声明位置,并将您的比赛放入第一个捕获组:
(?:^module\s+asdf\b.*(?:\n+input.*)*\s+|\G)(output.*)\n+(?=(?:(?!(?:end)?module).*\n)*endmodule)
说明
(?:
非捕获组
^module\s+asdf\b.*(?:\n+input.*)*\s+
从字符串的开头匹配模块asdf中包含输入的部分|
或\G
在上一场比赛结束时声明位置)
关闭非捕获组(output.*)\n+
捕获第1组输出,直到字符串末尾(?=
正向前进,断言右边是
(?:(?!(?:end)?module).*\n)*endmodule
匹配endmodule并确保在字符串开头之间的no模块之间。)
积极回望如果还支持\K
,则可以获取匹配项而不是捕获组:
(?:^module\s+asdf\b.*(?:\n+input.*)*\s+|\G)\Koutput.*\n+(?=(?:(?!(?:end)?module).*\n)*endmodule)