Соответствует содержимому только внутри группы выбора - PullRequest
1 голос
/ 29 апреля 2019

Я ищу способ сопоставления некоторого содержимого, которое должно существовать только внутри моей группы выбора.Скажем, у меня есть строковый файл, подобный этому:

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.

В идеале я хочу сопоставить весь модуль, например:

(module\s+asdf[\s\S]+?endmodule)

Теперь в этой группе я хочу искать дальше.Я знаю, что во время написания скрипта мы можем записать содержимое всего модуля в одну переменную, а затем на следующем шаге выполнить повторный поиск в этом содержимом.Но есть ли способ поиска по содержимому с захваченной группой в одном кадре?

Есть ли способ поиска по захваченной группе рег в одном кадре.

(module\s+asdf[\s\S]+?endmodule)

Ожидается совпадение:

output c;

output d;

output e;

output y;

1 Ответ

1 голос
/ 30 апреля 2019

Если поддерживается, вы можете использовать якорь \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 Сопоставьте конечный модуль и убедитесь, что между ними нет модуля вначало строки
  • ) Закрыть положительный прогноз

Regex demo

Если \Kтакже поддерживается, вместо групп захвата вы можете получить совпадения:

(?:^module\s+asdf\b.*(?:\n+input.*)*\s+|\G)\Koutput.*\n+(?=(?:(?!(?:end)?module).*\n)*endmodule)

Regex demo

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