56

メソッドにデリゲートを渡すためにラムダ式を使用する C# のコードがあります。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);

そして、これはラムダ式が配置されていない PowerShell スクリプトです。

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

注:私の質問は、この正規表現の問題を解決することではありません。PowerShell でデリゲートを受け取るメソッドにラムダ式を渡す方法を知りたいだけです。

4

3 に答える 3

68

{ some code here }PowerShell 2.0 では、スクリプト ブロック ( ) をデリゲートとして使用できます。

$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(...)
于 2012-06-12T11:36:30.007 に答える
26

時々、次のようなものが欲しいだけです:

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

(匿名の「関数」を宣言し、すぐに呼び出します。)

于 2013-06-21T21:53:45.153 に答える
16

このオーバーロードを使用できます

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

デリゲートはスクリプト ブロック (ラムダ式) として渡され、MatchEvaluator は $args 変数を介してアクセスできます。

[regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })
于 2012-06-12T11:49:23.993 に答える