Lambda Expression in Powershell

Solution 1:

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:

Sometimes you just want something like this:

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

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

Solution 3:

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