2016-03-11 4 views
1

У меня есть следующий текст (модуль конкретизация в VHDL) несколько раз с XXX, YYY и ZZZ как фиксированные слова:Заменить текст, оставив конкретные слова

my_inst: XXX 
port map ( 
    YYY => my_o, 
    ZZZ => my_i 
); 

Я хотел бы найти весь блок, который инстанцирование XXX и замените, как показано ниже.

XXX -> BUFF 
YYY -> b_o 
ZZZ -> b_i 

Остальная часть текста не должна изменяться.

Опять же, важно, чтобы YYY был заменен на b_o, только когда экземпляр модуля XXX был создан, а не в других случаях.

Спасибо! Sasa

ответ

0

Попробуйте это:

(?<key1>\w+):\s*(?<x>XXX)\n*\s*(?<key2>[^(]+?)\s*\(\s*\n*(?=.*?(?<y>YYY)\s=>)(?=.*?(?<z>ZZZ)\s=>)(?:[^(]+)\n*\) 

Demo

Выход:

MATCH 1 
key1 [0-8] `my_inst1` 
x [10-13] `XXX` 
key2 [15-23] `port map` 
y [29-32] `YYY` 
z [44-47] `ZZZ` 
+0

Великий, спасибо! Я немного изменил его, чтобы хранить только те, которые меня интересуют: : \ s * (? XXX) \ n * \ s * port \ s * \ n * map \ s * \ n * \ (\ s * \ n * (? =. *? (? YYY) \ s =>) (? =. *? (? ZZZ) \ s =>) (?: [^ (] +) \ n * \) Как я могу применить его в файле, чтобы заменить все из них, когда они произошли вместе? –

Смежные вопросы