给定以下类型的输入(包含在众多文件中):
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的。但我甚至无法让比赛奏效:
以下是我尝试的内容:
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 - 我已经谷歌搜索了这个问题,并搜索了stackoverflow。问题是大多数人使用" multiline"只需要搜索多行...一次一个。那些正确使用它的人有着截然不同的模式,他们试图匹配那些不能帮助我的模式。如果有一个帮助我的答案,我无法找到它。
答案 0 :(得分:3)
您不需要/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