рекурсивное сопоставление для строкового разделителя с регулярным выражением - PullRequest
0 голосов
/ 02 января 2019

В языке 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 голосов
/ 02 января 2019

Смысл части [??????]+ состоит в том, чтобы соответствовать любому тексту, который не соответствует символу, который равен или является начальной точкой разделителей.

Итак, в вашем случае вам нужно сопоставить любой символ, кроме символа, который начинается с подстроки begin или end:

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

См. Демоверсию regex

. здесь будет соответствовать любому символу, включая символы разрыва строки из-за модификатора s. Обратите внимание, что фактическая реализация может нуждаться в корректировке (например, в PHP модификатор g не должен использоваться, поскольку для этого есть специальные функции / функции).

Кроме того, поскольку вы просматриваете весь шаблон, вам не нужны внешние скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...