Regex 如何在两个字符串之间匹配加密文本,知道我的正则表达式有什么问题吗?

Regex 如何在两个字符串之间匹配加密文本,知道我的正则表达式有什么问题吗?,regex,flex-lexer,yacc,lex,Regex,Flex Lexer,Yacc,Lex,我正在尝试匹配以开头的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]

我正在尝试匹配以开头的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
这个。在lex和flex中,匹配除新行以外的任何字符。因此,由于文本可以包含新行,因此需要使用。|\n*而不是。*

然而,这不是您唯一的问题-至少在您的输入可能包含多个受保护的块的情况下不是这样。按原样,您的规则将匹配到最后一个pragma protect end_protected行的任何内容,因为lex和flex总是为给定规则匹配尽可能多的输入。因此,如果有两个受保护的块,它们将被视为一个块。因为lex和flex都没有非贪婪的概念,所以不能通过修改regex本身来解决这个问题


相反,您可以使用。使用这种方法,您将有一个正则表达式匹配受保护块的开头,它将开始条件更改为受保护,然后是块结尾的规则,它将恢复默认条件。

您需要在flex或yacc或任何地方启用点匹配换行符模式|\修正了我的正则表达式。一个很好的观点是,我必须概括和思考多个受保护的块。我将检查上面的链接,了解更多关于启动条件的信息,以便在我的代码中正确使用它。