Как сопоставить зашифрованный текст между двумя строками, есть идеи, что не так в моем Regex? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь сопоставить текст verilog, который начинается с

`pragma protect begin_protected

, заканчивается

`pragma protect end_protected

, используя это регулярное выражение

`[pP][rR][aA][gG][mM][aA]([\t ]+)[pP][rR][oO][tT][eE][cC][tT]([\t ]+)[bB][eE][gG][iI][nN]_[pP][rR][oO][tT][eE][cC][tT][eE][dD]([\t ]*)(.*)`[pP][rR][aA][gG][mM][aA]([\t ]+)[pP][rR][oO][tT][eE][cC][tT]([\t ]+)[eE][nN][dD]_[pP][rR][oO][tT][eE][cC][tT][eE][dD]([\t ]*)

фактический текст между началом и концом может содержать зашифрованный текст или другой

`pragma protect 

, например

`pragma protect begin_protected
`pragma protect key_method = "rsa"
`pragma protect data_block
k6tBDqTQakg3qSojs4OdAY/r7tL9Wk8+Lk4xS2WtANXqdpfHexLIrZni6F2envAE
v9eGY1ay/TPE7dDRrRdDZil14xYec+5kwCIVbhdp27A5RrHQEq6NAppieMJBc0wG
GqzAPujU338BKb0H7BuWz5r6ZmRTYnDhch/aqFldGfNi3rCwSQPsrniPi2s8QCkz
5SdoKv7QTIQh0VH4ic37jd+4XnADws0Z+5FM3SnQ8wkD7x8X8Y5Owq9wXG82xngI
SthAiqHFEP2RFSM8iVuX7cIPGxNLy8Dz9IEFno1TOqdStm4YPQDHTHfUL1IIfHbu
t6SQDCRiXGudU9g8e9GlTLhHVdkU+D5D5tWKli+1b8lqzVUUWfuqeT+VAyd+nwBd
5dkCjixV30IZ9/xRMDGrmVXYK85chb2X7OYlHMZdX/alWPuCfEHbLE7vvAijoYYg
gQSTPZaMqAyME3TmDJaquo0hbLVFD/OhKnoD3vFxN1K1L7UOnOQH4PeDdjSYAech
Bpu3uwdlqs3/Smad8zwAt8+e4Ws6gN80q2E/pekbx0MCz7HddPCrb59q9Co4uD2Q
JHjKuYePcscc1Hz15HpH4dLozz2t6AeV5ZdgnXJhtEGiBVESpBySE89jgFYnD70K
Oybe6YUbRltG0qYn2WE+aohbmb0oNjBXVlx3ESwdYd7nD1Bt2+0OQPZWwzWi1kbU
RRQopy6x5abqr8EnBgO4sh0iMRnmZs7/vYFq0GEoDIRNgtlfULiq8mhVwdmRmtob
9FpHBDYkA8Mjs/O9e5CXU9eqgiW8ogCL/JUYJlVAnFkjv26CmgCRyzEoNasyPY3z
G0mKQjZ4ACXr7DGi3dAeg/QrYxUk9VxgPQxlK1KOy5UHwZ71UPli/5xhQzz+uh0I
IQtUUXDOQKFAUhovlRxgeqh89BhQ4R0DxEW5rp2eec9Pvxb1kFA3YQ3sS65DYjNz
ybPNLg4FkJ2ET1Q1ArbNBDnbBWexgTuHEEs/GB9XHDBskvz9iFOFE7j8AI3l/nSr
I4/c24GboZi1EYKN4CJFQoCo7daSJ4lv/QPBG6vtSzizx5mL3Eq6C+LBa08DvlsC
a900HyJ6IUAzWX59VzsTfi3BEqiDOIvUx2Hm0g94ghfqxbLZA3zro/gHC0uwgfwH
YocG13UKR/m5iPny98aFlJST9TmMojh3QKLg4VZEy6Btu4dEyMOQOEwUEvG1oz3R
lFHl3pSHs6oLqnH5DAjg+SzLO2n4VmcCWG8M0a+a4GqyLEZA5KGf+ubcKEU4n9ur
/15l4XeSsBFMRwUmvx1jgZyRIh6P+2qAYtFfkxqQN7oCQN4VNxr2wVIGTt86cjmz
Caj19qu1P4M9ljhnlJCLsg==
`pragma protect end_protected

1 Ответ

0 голосов
/ 22 октября 2018

. в lex и flex соответствует любому символу , за исключением новых строк .Так как ваш текст может содержать новые строки, вам нужно будет использовать (.|\n)* вместо .*.

Однако это не единственная ваша проблема - по крайней мере, если ваш ввод может содержать более одногозащищенный блок.Как правило, ваше правило будет соответствовать чему-либо вплоть до последней pragma protect end_protected строки, потому что lex и flex всегда соответствуют как можно большему количеству входных данных для данного правила.Таким образом, если у вас есть два защищенных блока, они будут рассматриваться как один блок.Поскольку ни в lex, ни в flex нет концепции жадности, вы не можете это исправить, изменив само регулярное выражение.

Вместо этого вы можете использовать условия запуска .При таком подходе у вас будет одно регулярное выражение, соответствующее началу защищенного блока, что изменит начальное условие на PROTECTED, а затем правило для конца блока, которое восстанавливает условие по умолчанию.

...