regex - 仅匹配选择组内的内容
问题描述
我正在寻找一种方法来匹配一些内容,这些内容应该只存在于我的选择组中。说,我有一个这样的字符串文件:
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
通过这种惰性匹配以及输出端口,我还匹配了 group-3 中的分配语句。
理想情况下,我想匹配整个模块,如:
(module\s+asdf[\s\S]+?endmodule)
现在,在这个组中,我想进一步搜索。我知道在编写脚本时,我们可以将整个模块的内容捕获到一个变量中,然后在下一步中重新搜索这些内容。但是,有没有办法在一次拍摄的组中搜索内容?
有没有办法在捕获的正则表达式组中进行一次搜索。
(module\s+asdf[\s\S]+?endmodule)
期望匹配:
output c;
output d;
output e;
output 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
在上一场比赛结束时断言位置
)
关闭非捕获组(output.*)\n+
在第 1 组输出中捕获直到字符串结束(?=
正向前瞻,断言右边是(?:(?!(?:end)?module).*\n)*endmodule
匹配 endmodule 并确保在字符串开头没有模块
)
关闭正向前瞻
如果\K
也支持,您可以获得匹配项而不是捕获组:
(?:^module\s+asdf\b.*(?:\n+input.*)*\s+|\G)\Koutput.*\n+(?=(?:(?!(?:end)?module).*\n)*endmodule)
推荐阅读
- html - 如何在使用 clear:both 的图像下添加行间距
- reactjs - What is the best approach for calling third-party react hooks conditionally?
- javascript - In React, failing to stop Axios request when component unmounts
- python - Tensorflow 2.0 train model on single GPU
- python - Python programmatically parse complex string
- java - Cosmos change feed processor and concurrency within a single host
- windows - Calling Mruby library functions in Crystal segfaults on MSVC environment
- java - 如何从 Java 代码在 Java EE 8 中正确创建过滤器?
- apache-kafka - How to print TimeWindowedKStream and KTable in Kafka streams?
- javascript - Javascript: How do I wait until async response has required data before continuing