在PowerShell中的Lambdaexpression式

我有一个C#中的代码使用lambdaexpression式委托传递给一个方法。 我怎样才能在PowerShell中实现这一点。 例如下面是一个C#代码:

string input = "(,)(;)(:)(!)"; string pattern = @"\((?<val>[\,\!\;\:])\)"; var r = new Regex(pattern); string result = r.Replace(input, m => { if (m.Groups["val"].Value == ";") return "[1]"; else return "[0]"; }); Console.WriteLine(result); 

这是没有使用lambdaexpression式的PowerShell脚本:

 $input = "(,)(;)(:)(!)"; $pattern = "\((?<val>[\,\!\;\:])\)"; $r = New-Object System.Text.RegularExpressions.Regex $pattern $result = $r.Replace($input, "WHAT HERE?") Write-Host $result 

注意:我的问题不是解决这个正则expression式问题。 我只想知道如何将一个lambdaexpression式传递给在PowerShell中接收委托的方法。

在PowerShell 2.0中,您可以使用脚本块( { some code here } )作为委托:

 $MatchEvaluator = { param($m) if ($m.Groups["val"].Value -eq ";") { #... } } $result = $r.Replace($input, $MatchEvaluator) 

或者直接在方法调用中:

 $result = $r.Replace($input, { param ($m) bla }) 

小费:

您可以使用[regex]将string转换为正则expression式:

 $r = [regex]"\((?<val>[\,\!\;\:])\)" $r.Matches(...) 

有时你只想要这样的东西:

 {$args[0]*2}.invoke(21) 

(将会声明一个匿名的“函数”并立即调用它。)

你可以使用这个过载

 [regex]::replace( string input, string pattern, System.Text.RegularExpressions.MatchEvaluator evaluator ) 

委托作为脚本块(lambdaexpression式)传递,MatchEvaluator可以通过$ argsvariables访问

 [regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })