创建特定的正则表达式

Creating a specific regex

我正在尝试在 Code::Blocks 中创建一个正则表达式,以查找使用特定参数调用函数时出现的所有事件。

函数调用:

int mdw_button(int x1, int y1, int x2, int y2, int bn, ....

并且我想查找第 5 个参数何时为特定值的出现...

所以基本上

好的,我被要求提供一个最低限度的工作示例:

得到很多结果...基本上任何以以下内容开头的结果: mdw_button( 并在以后的任何地方有一个 15。这有效,但有很多误报。

mdw_button(.*[,]+ 15 这行得通,我得到了一个较短的列表,但仍然有很多误报

我尝试了很多东西,但完全没有结果:

mdw_button(.*[,]+ 15

mdw_button( ([A-Za-z0-9]{1}[,])4 15

我想要符合以下模式的东西: [任何文本或数字后跟一个逗号]

然后我想跳过其中的 4 个并匹配下一个

这是我正在查看的一些代码示例:

mdw_button(xa, ya, xb, ya+bts-2, 26, num, type, obt, 0,  15,  13, 14, 1,0,0,d); ya+=bts; // stat | fall | carry
mdw_button(xa, ya, xb, ya+bts-2, 49, num, type, obt, 0, 12 ,  15,  0, 1,0,0,d); ya+=bts; // door type
mdw_button(xa, ya, xb, ya+bts-2, 4,  num, type, obt, 0, abc, atc,  0, 1,0,0,d); ya+=bts; // set linked item
mdw_button(xa, ya, xb, ya+bts-2, 50, num, type, obt, 0, abc, atc,  0, 1,0,0,d); ya+=bts; // enter mode (up | down)
mdw_button(xa, ya, xb, ya+bts-2, 53, num, type, obt, 0, abc, atc,  0, 1,0,0,d); ya+=bts; // move type
mdw_button(xa, ya, xb, ya+bts-2, 51, num, type, obt, 0, abc, atc,  0, 1,0,0,d); ya+=bts; // exit link show
mdw_button(xa, ya, xb, ya+bts-2, 52, num, type, obt, 0,  13,  15,  0, 1,0,0,d); ya+=bts; // get new shape
mdw_colsel(xa, ya, xb, ya+bts-2, 5,  num, type, obt, 0,   0,   0,  0, 0,0,0,d); ya+=bts; // change color

你可以试试这个:

mdw_button\((?:\s*[\w+-]+,){4}\s*50,

本例中第五个参数的具体取值为“50”。它只会匹配直到并包括第五个 parameter.If 的部分,你想匹配整个调用,你应该添加一个 .*?;。它仍然只会匹配呼叫而不是整行。

您的出发点是正确的。但是:

  • 要匹配文字 (,您必须将其转义为 \(
  • 如果你想计算前四个参数,你应该像这样用 non-capturing 组对它们进行分组:(?:\s*[\w+-]+,)
  • 该组以可选数量的空格开头:\s*,后跟最少 1 个或多个单词字符 (\w) 或 +- - 至参数中支持更多的操作或空格,你将不得不扩展这个!
  • 组内还有决赛,很重要
  • 您希望该组恰好出现 4 次:{4}
  • 后面还有可选数量的空格
  • 那么您搜索的参数在
  • 以逗号结尾,以防止结果只匹配您要查找的参数的开头。

请记住,您无法使用正则表达式构建完整的表达式解析器,因此如果您有括号或更复杂的表达式作为参数,您可能最好使用常规解析器。

不是正则表达式,而是一种使用 awk.

过滤数据的方法

假设您的输入数据在文件 data.txt.

你可以这样做:

awk 'BEGIN { FS = ", " } /^mdw_button/ { if ( == "4") print }' data.txt
  • BEGIN { FS = ", " }:设置字段分隔符为,
  • /^mdw_button/:行开头为“mdw_button”
  • 如果第 5 个字段 == "4",打印该行。

使用您的示例数据,结果是:

mdw_button(xa, ya, xb, ya+bts-2, 4,  num, type, obt, 0, abc, atc,  0, 1,0,0,d); ya+=bts; // set linked item