-replace заменяет группу RegEx своим именем - PullRequest
0 голосов
/ 10 января 2019

У меня есть оператор замены, подобный этому:

$var1 = "http"
$var2 = "1.2.3.4"
$json = $json -replace '(url = ["''])(.*)(:\/\/)(.*)(["''])', "`$1$var1`$3$var2`$5"

Предполагалось оставить нижнюю строку как есть:

url = "http://1.2.3.4"

во время его изменения на

url = "http$31.2.3.4"

Насколько я понимаю, `$3 следует заменить на :// точно так же, как `$5 был заменен на ".

Есть ли какое-то правило, которое я постоянно скучаю?

Edit:

Я проверил на нескольких компьютерах и вот что я узнал:

  1. Этот же код отлично работает на других компьютерах (проверено на Windows Server 2016 и Windows 10),
  2. Тот же код отлично работает на виртуальной машине Azure, подключенной через удаленный рабочий стол (Windows Server 2016),
  3. На моем компьютере (Windows Server 2019) происходит сбой, как описано,
  4. На той же виртуальной машине, что и в пункте 2. При использовании удаленного рабочего стола с моего компьютера она также не работает.

Теперь я действительно понятия не имею, что происходит. Может быть, что-то с языком?

Настройки:

  • Расположение: США
  • Язык: английский (США)
  • Раскладка клавиатуры: PLP

Конкретные настройки:

  • Числовые форматы: -123 456 789,00
  • Первый день недели: понедельник
  • Формат времени: ЧЧ: мм: сс
  • Формат даты: гггг-мм-дд

Я знаю, что это, кажется, не связано, но я понятия не имею.

Edit2:

Похоже, что RegEx не работает должным образом, когда первый символ после (даже экранированного) группы RegEx является числом (даже в качестве переменной). Но все еще не знаю, как это опустить.

1 Ответ

0 голосов
/ 10 января 2019
  • Чтобы точно соответствовать лидирующей цитате, я предлагаю использовать обратную ссылку с вложенной группой
  • Чтобы вставить переменную в строку замены, заключите имя в фигурные скобки
  • косую черту не нужно экранировать.
  • для вставки группы захвата (номер $1) в замену, которая может помешать следующему тексту, заключить номер также в ${1} фигурные скобки

## Q:\Test\2019\01\10\SO_54131783.ps1

$json = 'url = "http://localhost"'

$var1 = "http"
$var2  = "1.2.3.4"

$json = $json -replace '(url = (["''])).*?(://).*?(\2)',
                       "`${1}${var1}`${3}${var2}`${2}"
$json

url = "http://1.2.3.4"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...