Regex perl中的多行模式搜索和替换

Regex perl中的多行模式搜索和替换,regex,perl,powershell,Regex,Perl,Powershell,给定以下类型的输入(包含在多个文件中): 我正在尝试使以下正则表达式匹配: 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。但我甚

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

我正在尝试使以下正则表达式匹配:

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。但我甚至连火柴都打不动:

以下是我尝试过的:

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的/\r//g'
,以消除这个潜在的问题,但我也希望有一个不会阻塞
\r
的解决方案


PS——我在谷歌上搜索了这个问题,搜索了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

这看起来很好,我很感谢对我可以做得更好的事情的澄清。你有没有看到任何可能导致我的正则表达式不匹配的东西?我们需要更多的例子来说明你想匹配什么(或者你不想匹配什么)为了提供更多帮助。@zzxyx:非空格字段可能应该是
\S+
,因为所有这些字段都不匹配没有意义您的正则表达式修复的问题是我不想要
在我的正则表达式中,因为测试中的用法是
if(myFunc(etc)){
所以…主要的问题基本上是一个bug,而不是对一些基本问题的误解。我知道stackoverflow在一些可以帮助其他人的问题上很重要。我应该删除它吗?我认为没有理由删除它,特别是如果答案对你有帮助的话。如果分号让你感觉更好,我可以更新答案,明确提到分号R
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