首页 > 解决方案 > 仅匹配选择组内的内容

问题描述

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

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;

标签: regex

解决方案


如果支持,您可以使用\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)

正则表达式演示


推荐阅读