带有正则表达式的字符串定界符的递归匹配

时间:2019-01-02 11:15:14

标签: regex recursion

在verilog语言中,这些语句包含在开头/结尾定界符中,而不包含在括号中。

always@ (*) begin
    if (condA) begin
       a = c
    end
    else begin
       b = d
    end
end

我想解析最外面的begin-end及其语句,以检查python中的编码规则。使用正则表达式,我想要带有正则表达式的结果,例如:

if (condA) begin
   a = c
end
else begin
   b = d
end

对于括号定界符,我找到了类似的答案。

int funcA() {
  if (condA) {
    b = a
  }
} 

正则表达式:

/({(?>[^{}]+|(?R))*})/g

但是,我不知道如何为“开始端”修改原子组([^ {}])

/(begin(?>[??????]+|(?R))*end)/g

1 个答案:

答案 0 :(得分:0)

[??????]+部分的要点是与不匹配等于或作为分隔符的起始字符的任何文本相匹配。

因此,在您的情况下,您需要匹配除以beginend子字符串开头的char以外的任何char:

/begin(?>(?!begin|end).|(?R))*end/gs

请参见regex demo

由于.修饰符,此处的s将匹配任何字符,包括换行符。请注意,实际的实现可能需要调整(例如,在PHP中,不应该使用g修饰符,因为它具有特定的功能/功能)。

此外,由于您递归了整个模式,因此不需要外部括号。