Через несколько дней после того, как я задал этот вопрос, я случайно выяснил проблему.
$number
Ссылки на группы захвата в синтаксисе -replace
являются просто буквальными строками!
Powershell никогда не рассматривает их как нечто особенное, но движок Regex делает.Посмотрите на пример ниже:
$array = "z", "fg"
$array -replace "(\w{1,2})", '$1'.Length
#output: 2
# 2
Выглядит странно?Как получается, что группа захвата $1
имеет длину 2 с "z" и "fg"?Ответ в том, что вычисляемая длина - это строка $1
, а не "z", "fg"!
Давайте рассмотрим другой пример, на этот раз давайте заменим букву в группе захвата,посмотрим, что произойдет:
$array -replace "(\w{1,2})", '$1'.Replace("z", "6")
#output: z
# fg
Вывод показывает, что .replace
не относится к группе захвата 1.
$array -replace "(\w{1,2})", '$1'.Replace("1", "6")
#output: $6
# $6
Видите?Заменяемая строка сама по себе $1
.
Теперь нужно понять причину проблемы .padleft
.PS добавьте буквенную строку $1
и покажите результат с содержимым группы.
Когда я добавляю его с помощью .Padleft(2, "0")
, ничего не происходит, потому что сам "$ 1" имеет длину 2.
$array -replace "(\w{1,2})", '$1'.PadLeft(2, "0")
# output: z
# fg
Если вместо этого я добавляю его с помощью .Padleft(3, "0")
, на этот раз метод pad вступает в силу, он применяет дополнительные «0» к $1
, но показывает результат с «0», предшествующим содержанию $1
.
$array -replace "(\w{1,2})", '$1'.PadLeft(3, "0")
#output: 0z
# 0fg