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

时间:2009-02-13 11:12:46

标签: c regex matlab

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

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

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

更好的是正则表达式列表,可用于从#define,枚举和全局变量等常规C代码构造中获取额外值。

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

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

编辑:看起来正则表达式不会进行递归或任意深度匹配。根据{{​​3}}和here

7 个答案:

答案 0 :(得分:1)

您是否查看了以下网站,该网站提供了有关正则表达式的大量教程和示例: -

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我认为正则表达式不适用于任意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 <test.c:6:1, line:10:1>
  (DeclStmt 0xc01e70 <line:7:2>
    0xc01e30 "float g"
  (ReturnStmt 0xc01eb0 <line:9:2, line:1:11>
        (IntegerLiteral 0xc01e90 <col:11> 'int' 1)))
(CompoundStmt 0xc020a0 <test.c:13:1, line:16:1>
  (DeclStmt 0xc02060 <line:14:2>
    0xc02010 "int g =
      (IntegerLiteral 0xc02040 <col:8> 'int' 7)"
  (ReturnStmt 0xc01b50 <line:15:2, line:1:11>
    (IntegerLiteral 0xc02080 <col:11> 'int' 1)))
typedef char *__builtin_va_list;
Read top-level variable decl: 'm'

int fun(char *y)


int main()

答案 3 :(得分:1)

我假设您有权访问相关的C代码。如果是,则定义两个宏:

#define BEGIN_MATLAB_DATA
#define END_MATLAB_DATA

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

这个正则表达式:

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

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

答案 6 :(得分:1)

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

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