Просто чтобы объяснить, что происходит, в "| <strong>$(`"`$2`".ToUpper())</strong> | `$1 |"
PowerShell оценивает выделенное подвыражение до передачи строки оператору -replace
, а не после того, как произошла операция замены.
Другими словами, ToUpper
вызывается для строкового значения $2
, в результате чего | $2 | $1 |
используется для операции замены. Это можно увидеть, включив в строку подвыражения букву, например:
"456,Jane Doe" -replace '^(\d{3}),(.*)$',"| $(`"zz `$2`".ToUpper()) | `$1 |"
Имеет эффективную строку замены | ZZ $2 | $1 |
, в результате чего получается | ZZ Jane Doe | 456 |
.
Аналогично, вторая версия без круглых скобок, "| <strong>$(`"`$2`".ToUpper)</strong> | `$1 |"
, оценивается как "some string".ToUpper
, что помещает массив определений перегрузки для метода ToUpper
в System.String
в строке замены.
Чтобы сохранить операцию замены как однострочную, ответ Джоуи с использованием перегрузки MatchEvaluator
на Regex.Replace
работает хорошо. Или вы можете выполнить форматирование строки самостоятельно, основываясь на результатах -match
:
if( '456,Jane Doe' -match '^(\d{3}),(.*)$' ) {
'| {0} | {1} |' -f $matches[2].ToUpper(),$matches[1]
}
Если это необходимо заменить в контексте большей строки, вы всегда можете выполнить замену литерала, чтобы получить окончательный результат:
PS> $r = '| {0} | {1} |' -f $matches[2].ToUpper(),$matches[1]
PS> 'A longer string with 456,Jane Doe in it.'.Replace( $matches[0], $r )
A longer string with | JANE DOE | 456 | in it.