Edit:
После повторного рассмотрения этого вопроса я добавил второй пример, который, я надеюсь, высветит, где усилилась моя путаница, а именно к одной группе захвата, доступной по ее индексу (1), и значению, которое я ожидал от $filecontent
по совпадению был также 1.
Этот вопрос указывает, что обратный тик может использоваться для адресации групп захвата в строке в двойных кавычках при обращении к другим переменным.
Если вам нужно сослаться на другие переменные в выражении замены (как вы, возможно), вы можете использовать строку в двойных кавычках и экранировать доллары с обратным тиком
Однако я вижу интересное поведение, которое не могу объяснить.
$VersionReplacementRegex = "(\d+\.)\d+" #capture first digit + dot b/c I want to keep it
$BuildVersionValidationRegex = "\d+\.\d+\.\d+"
$VersionData = [regex]::matches("some-18.11.8",$BuildVersionValidationRegex)
$NewVersion = $VersionData[0] #matches 18.11.8
$filecontent = "stuff 1.0.0.0 other stuff" #Get-Content($file)
замена текста в $filecontent
с использованием группы захвата, как указано в связанном вопросе, дает неполный результат ...
$filecontent -replace $VersionReplacementRegex, "`$1$NewVersion" | Write-Host
возвращает: 118.11.8
ожидается: 1.18.11.8
Но добавление пробела между $1
и $NewVersion
дает другой, но одинаково бесполезный результат ..
$filecontent -replace $VersionReplacementRegex, "`$1 $NewVersion" | Write-Host
возвращает: 1. 18.11.8
Захваченная точка появляется здесь, но появляется и нежелательное пространство.
В этом примере результаты несколько схожи, но кажется, что группа захвата получает неправильное значение все вместе.
$NewVersion = 18.11.8
$filecontent = "stuff 5.0.0.0 other stuff"
$filecontent -replace "(\d+\.)\d+", "`$1$NewVersion" | Write-Host
# returns: 118.11.8
# expected: 5.18.11.8
Добавление пробела в строке замены возвращает: 5. 18.11.8
Итак, что мне не хватает, или есть лучший способ сделать это?