我在C#类上运行以下powershell脚本,以便用空构造函数替换构造函数。我在自动生成的许多文件中执行此操作。
$nl = [Environment]::NewLine
foreach($item in Get-ChildItem $path) {
if($item.extension -eq ".cs") {
$name = $item.name
$name = $name.replace('.cs', '')
$reg = '(public ' + $name + '\(.*?\})'
$constructorString = [regex]$reg
$emptyConstructor = 'public ' + $name + '()' + $nl + '{' + $nl + '}' + $nl
Get-Content $item.fullname -Raw | Where-Object { $_ -match $constructorString } | ForEach-Object { $_ -replace $constructorString, '$1'}
}
}
这些课程有
的形式public Bar()
{
this.foo = new Foo();
}
这导致没有匹配,如果需要更多信息,请告诉我。
答案 0 :(得分:2)
无需将模式转换为正则表达式。试试这个:
$item | Get-Content -raw | Where {$_ -match "(?s)(public\s+${name}\s*\(.*?\})"} | ...
我相信您遇到的问题是,虽然您使用-Raw
参数将C#文件作为单个字符串读取,但字符串中有换行符.*
不会除非在正则表达式中使用单行模式,否则遍历。这就是(?s)
的作用。
此外,如果您使用的是PowerShell V3,则可以使用basename而不是替换例如:
$name = $item.basename
BTW你有没有看过Roslyn作为正则表达式搜索/替换方法的替代方法? Roslyn将为您为每个源文件构建一个AST。有了它,您可以轻松找到默认构造函数并将其替换为空构造函数。