Reputation: 16296
I have a code in C# which uses lambda expressions for delegate passing to a method. How can I achieve this in PowerShell. For example the following is a C# code:
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);
And this is the PowerShell script without the lambda-expression in place:
$input = "(,)(;)(:)(!)";
$pattern = "\((?<val>[\,\!\;\:])\)";
$r = New-Object System.Text.RegularExpressions.Regex $pattern
$result = $r.Replace($input, "WHAT HERE?")
Write-Host $result
Note: my question is not about solving this regular-expression problem. I just want to know how to pass a lambda expression to a method that receives delegates in PowerShell.
Upvotes: 59
Views: 40570
Reputation: 2657
Sometimes you just want something like this:
{$args[0]*2}.invoke(21)
(which will declare an anonymous 'function' and call it immediately.)
Upvotes: 32
Reputation: 126842
You can use this overload
[regex]::replace(
string input,
string pattern,
System.Text.RegularExpressions.MatchEvaluator evaluator
)
The delegate is passes as a scriptblock (lambda expression) and the MatchEvaluator can be accessed via the $args variable
[regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })
Upvotes: 18
Reputation: 14880
In PowerShell 2.0 you can use a script block ({ some code here }
) as delegate:
$MatchEvaluator =
{
param($m)
if ($m.Groups["val"].Value -eq ";")
{
#...
}
}
$result = $r.Replace($input, $MatchEvaluator)
Or directly in the method call:
$result = $r.Replace($input, { param ($m) bla })
Tip:
You can use [regex]
to convert a string to a regular expression:
$r = [regex]"\((?<val>[\,\!\;\:])\)"
$r.Matches(...)
Upvotes: 79