2

置き換えたいフィールドを取得するために文字列を連結しているときにエラーが発生します。

以下は、私のスクリプトが行っていることの例です。

$TEXTTOREPLACEWITH= '6Q'

(Get-Content testfile.html) | ForEach-Object { $_ -replace '(.*)\$\(STRINGTOREPLACE\)(.*)', ('$1' +$TEXTTOREPLACEWITH+'$2')

次のように行入力のあるファイルに対してこれを実行した場合:

abc$(STRINGTOREPLACE)xyz

次の出力が期待されます。

abc6Qxyz

代わりに、このスクリプトを実行すると、出力は次のようになります。

$16Qxyz

これは、文字列の連結が完了するまで後方参照を解決してはならないという事実によるものだと思います。PowerShell でこれらの後方参照をすぐに解決して、表示されている出力を回避する方法はありますか?

4

2 に答える 2

3

1つ目、ポイントを逃した、答えが置き換えられた...

連結する'$1''6Q'(正規表現エンジンに渡される前に)取得され、置換する$16Q16番目のキャプチャはありません。

これを回避するには、一致 ( (?<name>)) および${name}置換文字列で名前付きグループを使用します。

ドキュメントを参照し、次の点に注意してください。

numberが、正規表現パターンで定義された有効なキャプチャ グループを指定していない場合$number、各一致を置き換えるために使用されるリテラル文字シーケンスとして解釈されます。

于 2013-08-28T19:55:19.390 に答える
0

名前付きキャプチャ グループを使用することもできます。

$rx = '(?i)(?<Beg>.*)\$\(STRINGTOREPLACE\)(?<End>.*)'
$texttoreplacewith='${Beg}6Q${End}'
$x = "abc`$(stringtoreplace)xyz"

[regex]::Replace($x, $rx, $texttoreplacewith)
于 2013-08-28T20:19:01.140 に答える