正则表达式忽略多余的括号
Regex ignore redundant braces
我正在构建一个 lex 程序,它将分析如下内容...
function myFunc {
if a = b {
print "Cool"
}
}
是否有可能,特别是使用 flex,来创建一个正则表达式来挑出第一个 { }
中的所有内容
所以我会得到
{ if a = b { print "Cool" } }
而不是
{ if a = b { print "Cool" }
目前在我的 flex 文件中我有这个正则表达式
{[^\0]*}
你尝试做的事情的一个问题是 RegEx 默认是贪婪的(可以做一些技巧来改变它,但你仍然会遇到问题),如果你 运行 在一个包含多个函数的文件中。原因是大部分编程语言都是Type 1 grammars乔姆斯基层次结构,或者上下文相关文法,而RegEx是Type 2(context-free)文法。如果不进行大量工作,根本不可能直接使用后者解析前者。对此的完整解释是……很长。但它归结为在上下文相关语法中,给定元素的含义可能会根据您在输入中的位置而改变,而在上下文无关语法中,每个元素都只有一个含义。在你的情况下,你不想匹配任何ole'}
,你想匹配相应的}
到一个开放的{
,这涉及到计算[=12=的数量] 和 }
你到目前为止已经看到了。
如果你真的想做代码解析而不需要重新发明轮子,犁,火,钢,一直到电,我建议你去看看AnTLR over on GitHub. AnTLR will allow you to create a grammar (if one does not already exist) for the language you are trying to parse and provide the parsed source code to you in the form of a Parse Tree. Parse trees are very, very easy to use and AnTLR has grammars already for almost every language imaginable, and plugins for several languages .
除此之外,我使用的在线正则表达式测试器和带有您的示例代码的 Notepad++ 都匹配。您可以尝试 RegEx {.*}
,它也匹配所有内容。
我正在构建一个 lex 程序,它将分析如下内容...
function myFunc {
if a = b {
print "Cool"
}
}
是否有可能,特别是使用 flex,来创建一个正则表达式来挑出第一个 { }
中的所有内容所以我会得到
{ if a = b { print "Cool" } }
而不是
{ if a = b { print "Cool" }
目前在我的 flex 文件中我有这个正则表达式 {[^\0]*}
你尝试做的事情的一个问题是 RegEx 默认是贪婪的(可以做一些技巧来改变它,但你仍然会遇到问题),如果你 运行 在一个包含多个函数的文件中。原因是大部分编程语言都是Type 1 grammars乔姆斯基层次结构,或者上下文相关文法,而RegEx是Type 2(context-free)文法。如果不进行大量工作,根本不可能直接使用后者解析前者。对此的完整解释是……很长。但它归结为在上下文相关语法中,给定元素的含义可能会根据您在输入中的位置而改变,而在上下文无关语法中,每个元素都只有一个含义。在你的情况下,你不想匹配任何ole'}
,你想匹配相应的}
到一个开放的{
,这涉及到计算[=12=的数量] 和 }
你到目前为止已经看到了。
如果你真的想做代码解析而不需要重新发明轮子,犁,火,钢,一直到电,我建议你去看看AnTLR over on GitHub. AnTLR will allow you to create a grammar (if one does not already exist) for the language you are trying to parse and provide the parsed source code to you in the form of a Parse Tree. Parse trees are very, very easy to use and AnTLR has grammars already for almost every language imaginable, and plugins for several languages .
除此之外,我使用的在线正则表达式测试器和带有您的示例代码的 Notepad++ 都匹配。您可以尝试 RegEx {.*}
,它也匹配所有内容。