查找并替换文件内的捕获组

查找并替换文件内的捕获组

我正在尝试读取一个文本文件,不管是什么语言......

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

...查找字符串

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

...并将捕获组((.+?))替换为另一个字符串(例如10.0)。然后写入文件并关闭它。

我如何才能获取捕获组,以便可以就地修改它并保存文件?我所有的尝试都用非捕获组替换整个匹配的行。

答案1

尝试积极回顾组而不是非捕获组:

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

后视组将被要求匹配,但它不会消耗任何字符。

替换字符串将只是'10.0'

一种不太奇特的方法是将非捕获组转变为普通组:

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

替换字符串将是'${1}10.0'(带单引号)。 代表${1}第一组。(您需要在“1”周围加上花括号,这样它就不会碰到“10.0”。)

答案2

解决方案

谢谢@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

相关内容