带有匹配括号的正则表达式

我正在尝试从C源代码中提取特定的硬编码变量。 我剩下的问题是我想解析数组初始化,例如:

#define SOMEVAR { {T_X, {1, 2}}, {T_Y, {3, 4}} } 

这足以将此示例解析为“{T_X,{1,2}}”和“{T_Y,{3,4}}”,因为这样可以递归以获得完整的结构。 但是,它需要足够通用,以便能够解析任何用户定义的类型。

更好的是正则表达式列表,可以用于来自一般C代码构造的额外值,如#define ,枚举和全局变量。

C代码是提供给我的,所以我无法控制它。 我宁愿不写一个一次解析一个字符的函数。 但是,有一系列正则表达式是可以的。

这不是将文件导入MATLAB或基本正则表达式的问题。 我正在使用特定的正则表达式来保留括号中的分组。

编辑:看起来正则表达式不进行递归或任意深度匹配。 根据这里和这里 。

编辑:现在问题已经更新,似乎我之前的回答错过了这一点。 我不知道你是否已经在Stack Overflow上搜索了其他与正则表达式相关的问题。 如果你没有,我遇到了两个可能有助于为你的问题提供指导(这似乎是一个问题,至少部分是试图匹配并跟踪开始和结束花括号): 这个一个和这一个 。 祝好运!

您是否查看过以下网站,其中提供了有关正则表达式的广泛教程和示例: –

http://www.regular-expressions.info/

也许vim的语法文件会对此有所帮助。 我不确定它是否有你想要的元素(我不做C),但它有很多元素,所以它绝对是一个起点。 下载vim(www.vim.org),并在vim / syntax / c.vim中查看一下。

我认为正则表达式不适用于任意C代码。 Clang允许您从C代码构建语法树并以编程方式使用它。

这可以很容易地用于全局变量,但#defines由预处理器处理,所以我不确定它们是如何工作的。

 cristi:tmp diciu$ cat test.c #define t 1 int m=5; int fun(char * y) { float g; return t; } int main() { int g=7; return t; } cristi:tmp diciu$ ~/Downloads/checker-137/clang -ast-dump test.c (CompoundStmt 0xc01ec0  (DeclStmt 0xc01e70  0xc01e30 "float g" (ReturnStmt 0xc01eb0  (IntegerLiteral 0xc01e90  'int' 1))) (CompoundStmt 0xc020a0  (DeclStmt 0xc02060  0xc02010 "int g = (IntegerLiteral 0xc02040  'int' 7)" (ReturnStmt 0xc01b50  (IntegerLiteral 0xc02080  'int' 1))) typedef char *__builtin_va_list; Read top-level variable decl: 'm' int fun(char *y) int main() 

我假设你有权访问有问题的C代码。 如果是这样,那么定义两个宏:

 #define BEGIN_MATLAB_DATA #define END_MATLAB_DATA 

包装要在这些宏之间提取的所有数据。 编译C代码时,它们会扩展为空,所以它们不会在那里造成伤害。

现在,您可以使用非常简单的正则表达式来获取数据。

这个正则表达式:

 (\{\s*[A-Za-z_]+)\s*,\s*\{\s*\d+\s*,\s*\d+\s*\}\s*\} 

看起来很合理,但我不知道这对你来说是否足够。 它充斥着\ s *以允许令牌之间的任意空格,从C的角度来看是允许的。 它会匹配看起来或多或少只是你的例子; 某种标识符后跟两个数字字符串。

定义大括号匹配的forms语言不是常规语言。 因此,您无法使用正则表达式来解决您的问题。

问题是你需要一些方法来计算你已经遇到的开口括号的数量。 一些正则表达式引擎支持扩展function,例如偷看,可用于解决您的问题,但这些可能很难处理。 您可能最好为此任务编写一个简单的解析器。