创建特定的正则表达式
Creating a specific regex
我正在尝试在 Code::Blocks 中创建一个正则表达式,以查找使用特定参数调用函数时出现的所有事件。
函数调用:
int mdw_button(int x1, int y1, int x2, int y2, int bn, ....
并且我想查找第 5 个参数何时为特定值的出现...
所以基本上
- 从
mdw_button(
开始
- 然后跳过 4 次以逗号结尾的数字或字母
- 然后在第五场比赛..
好的,我被要求提供一个最低限度的工作示例:
在 Code::Blocks 中使用 CTRL-SHIFT-F
打开 'Find in Files' 对话框
勾选'Look in all project files'
勾选'Regular Expression'
我试过在“要搜索的文本”字段中:
mdw_button(.*15
得到很多结果...基本上任何以以下内容开头的结果:
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
我正在尝试在 Code::Blocks 中创建一个正则表达式,以查找使用特定参数调用函数时出现的所有事件。
函数调用:
int mdw_button(int x1, int y1, int x2, int y2, int bn, ....
并且我想查找第 5 个参数何时为特定值的出现...
所以基本上
- 从
mdw_button(
开始
- 然后跳过 4 次以逗号结尾的数字或字母
- 然后在第五场比赛..
好的,我被要求提供一个最低限度的工作示例:
在 Code::Blocks 中使用 CTRL-SHIFT-F
打开 'Find in Files' 对话框勾选'Look in all project files'
勾选'Regular Expression'
我试过在“要搜索的文本”字段中:
mdw_button(.*15
得到很多结果...基本上任何以以下内容开头的结果:
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