我在C#中有一个代码,它使用lambda表达式将委托传递给方法。我如何在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);
这是没有lambda表达式的PowerShell脚本:
$input = "(,)(;)(:)(!)";
$pattern = "\((?<val>[\,\!\;\:])\)";
$r = New-Object System.Text.RegularExpressions.Regex $pattern
$result = $r.Replace($input, "WHAT HERE?")
Write-Host $result
注意:我的问题不是解决这个正则表达式问题。我只想知道如何将lambda表达式传递给在PowerShell中接收委托的方法。
答案 0 :(得分:52)
在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]
将字符串转换为正则表达式:
$r = [regex]"\((?<val>[\,\!\;\:])\)"
$r.Matches(...)
答案 1 :(得分:17)
有时你只想要这样的东西:
{$args[0]*2}.invoke(21)
(将声明一个匿名'函数'并立即调用它。)
答案 2 :(得分:11)
您可以使用此重载
[regex]::replace(
string input,
string pattern,
System.Text.RegularExpressions.MatchEvaluator evaluator
)
委托作为scriptblock(lambda表达式)传递,MatchEvaluator可以通过$ args变量访问
[regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })