regex - Perl中的多行模式搜索和替换

标签 regex perl powershell

给定以下输入类型(包含在许多文件中):

ret = myFunc(&pConfig->hConstraintList, &pConfig->util,
                   2, sizeof(rcConstraint_t),
                   NULL, NULL, NULL, NULL, NULL);

我正在尝试匹配以下正则表达式:
myFunc\((\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*?),\s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\).*;

想法是将其替换为以下内容:
myFuncNoCB($1 $2 $3 $4 $5);

它可以用作.NET正则表达式,但是在powershell中进行文件内搜索和替换是一件很麻烦的事,并且VS UI不完全支持多行表达式。

好吧...但我什至无法使比赛正常进行:

这是我尝试过的:
perl -0ne '/myFunc\((\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*?),\s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\).*;/gms' myfile.cpp

我的假设是,即使在多行模式下,perl也不考虑换行符空格?这将是一个完整的噩梦,因为每个参数之间可以有任意数量的空格,制表符,换行符。

坦率地说,我对任何可行的解决方案都感兴趣。这里有很多变量。我在此特定文件上做了perl -pi -e 's/\r//g'以消除该潜在问题,但我也希望解决方案也不会令\r阻塞。

PS-我已经用Google搜索了这个问题,并搜索了stackoverflow。问题在于,大多数使用“多行”的人只需要搜索多行...一次即可。那些正确使用它的人尝试匹配的模式有很大不同,这对我没有帮助。如果有可以帮助我的答案,我找不到。

最佳答案

您不需要/m修饰符,因为它会更改^$的行为,而您在正则表达式中都不使用它们。
/s同样适用-它使.与换行符匹配,但是您不需要它,\s已经与包括换行符在内的所有空格匹配。

我会在正则表达式中列出逗号,并在末尾省略.*,因为它可以(与/s)匹配文档的其余部分。

perl -0pe 's/myFunc\((\S*),\s*(\S*),\s*(\S*),\s*(\S*),\s*(\S*?),
             \s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\)
            /myFuncNoCB($1, $2, $3, $4)/xg' -- file

关于regex - Perl中的多行模式搜索和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47781514/

相关文章:

javascript - 删除 jQuery 中的空格

来自函数的哈希返回的 Perl 哈希切片

perl - 为什么在 BEGIN block 中首先执行 'use' 语句?

powershell - 如何将输出输出到变量

powershell - 使用PS将文件夹中的文件压缩为zip文件

regex - 如何组合正则表达式中的行?

regex - perl 正则表达式解释

powershell - Foreach parallel 缺少参数 'xxx' 的参数。指定一个 'System.Object'类型的参数再试一次

regex - 提取并重命名为数字 ID

perl - 试图预测 future 的结果,collat​​z,Perl