Я пытаюсь прочитать текстовый файл, не важно, на каком языке ...

$x = [IO.File]::ReadAllText("__init__.py")

... найти строку

$pattern = [regex] '(?s)(?:ExportSTL.+?global_scale = .+?default=)(.+?),'

... и заменить группу захвата ((.+?)) с другой строкой (например, 10.0). Затем запишите в файл и закройте его.

Как я могу попасть в группу захвата таким образом, чтобы я мог изменить ее на месте и сохранить файл? Все мои попытки заменить всю согласованную линию на группу без захвата.

2 ответа2

1

Попробуйте создать позитивную группу за исключением группы без захвата:

$pattern = [regex] '(?s)(?<=ExportSTL.+?global_scale = .+?default=)(.+?),'

Требуется совпадение с группой lookbehind, но она не будет использовать никаких символов.

Строка замены будет просто « '10.0' .

Менее экзотическим способом было бы превратить не захватывающую группу в нормальную группу:

$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'

Строка замещения будет иметь значение '${1}10.0' (с одинарными кавычками). ${1} представляет первую группу. (Вам нужны фигурные скобки вокруг "1", чтобы он не попадал в «10.0».)

0

Решение

Благодаря @dangph, вот сценарий с его предложением.

$x = [IO.File]::ReadAllText("__init__.py")
# Turned the non-capturing group into a normal group
$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'
# Put $1 in curly brackets, and added literal comma at end of replacement
$x -replace $pattern, '${1}10.0,' | Set-Content .\__init__.py

Обновленный Regex101

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .