Lambda Expression in Powershell

PowershellLambda

Powershell Problem Overview


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.

Powershell Solutions


Solution 1 - Powershell

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(...)

Solution 2 - Powershell

Sometimes you just want something like this:

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

(which will declare an anonymous 'function' and call it immediately.)

Solution 3 - Powershell

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() })

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSina IravanianView Question on Stackoverflow
Solution 1 - PowershellStefanView Answer on Stackoverflow
Solution 2 - PowershellRandall BohnView Answer on Stackoverflow
Solution 3 - PowershellShay LevyView Answer on Stackoverflow