我正在学习Tcl和正则表达式。我有一个需要的任务
要执行Tcl脚本并需要一些帮助。
我有一个C ++头文件,我想解析成一个表。这是一个定义常量的文件。
我需要解析两种表单:
const int a = 0x00000001; //Comment for this variable
const int b = 0x00000003; //Comment for this variable
和枚举中的定义如下:
CONSTNAMEA = MACROA | MACROB | 0x000A, //Comment for this variable
CONSTNAMEB = MACROA | MACROB | 0x00C1, //Comment for this variable
在第一组中,我需要替换'='和';'用'|'。这很容易用regsub完成。然而,第二组有点复杂,我似乎无法做到正确。
我希望能够做的是将'CONSTNAMEA','0x000A'以及注释拉出到单独的变量中。
我的想法是我需要三个正则表达式。一个用于解析名称,另一个用于解析数字,第三个用于解析。
The name regex would be "Start at beginning of string and stop at '='"
The number would be '|' {anything} ','
And the comment would be "//" {anything} '\n'
正确?我很感激构建这些正则表达式的任何帮助!
答案 0 :(得分:1)
单个正则表达式应足以捕获该行中的所有三个子字符串:
^\s*([a-zA-Z_]+)\s*=(?:\s*[a-zA-Z_]+\s*\|)*\s*([0-9a-fA-Fx]+),\s*\/\/(.*)$
该名称将作为第一组提供,数字将作为第二组,评论将作为第三组。
为了调试像这样的表达式,我推荐一个像regexper这样的工具,它将上面的正则表达式转换成一个易于理解的铁路图。