1

次の文字列置換での int へのキャストが Powershell で失敗する理由がわかりません。

PS D:\> $b = "\x26"

PS D:\> $b -replace '\\x([0-9a-fA-F]{2})', [char][int]'0x$1'

Cannot convert value "0x$1" to type "System.Int32". Error: "Could not find any recognizable digits."
At line:1 char:1

+ $b -replace '\\x([0-9a-fA-F]{2})', [char][int]'0x$1'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastFromStringToInteger

置換自体は正常に機能します。

PS D:\> [char][int]($b -replace '\\x([0-9a-fA-F]{2})', '0x$1')

&
4

2 に答える 2

1

演算子は、最初の-replace文字列が一致するパターンであると想定し、2 番目の引数が置換対象の「文字列」であると想定します。言語仕様から:

7.8.4.3 The -replace operator
Description:
The -replace operator allows text replacement in one or more strings designated by 
the left operand using the values designated by the right operand. This operator has 
two variants (§7.8). The right operand has one of the following forms:
•   The string to be located, which may contain regular expressions (§3.16). In this case, the replacement string is implicitly "".
•   An array of 2 objects containing the string to be located, followed by the replacement string.

文字列が評価されるまで $1 にアクセスできないと思います。それまでにさらに評価を行うには遅すぎます。つまり、この場合は型強制です。

于 2012-12-11T01:15:22.613 に答える
0

これは単一-replaceではできませんが、カスタムMatchEvaluatorコールバック ( docs ) を使用して実行できます。では、MatchEvaluatorコードを完全に制御できるため、好きなことを何でも実行できます。

$b = "\x26"

$matchEval = { 
  param($m)
  $charCode = $m.Groups[1].Value
  [char][int] "0x$charCode"
 }

 [regex]::Replace($b, '\\x([0-9a-fA-F]{2})', $matchEval)

>> &
于 2012-12-11T18:04:45.367 に答える