为了制定一个替换字符串,其长度应该匹配输入字符串的一个 - 潜在可变长度 - 子字符串,您需要通过 脚本块动态地 计算替换字符串(代表)。
在 PowerShell Core 中,您现在可以直接将脚本块作为 -replace operator 的替换操作数传递:
PS> '01234567890Alice Stone 3978 Smith st...' -replace
'(?<=^\d{10}).{20}', { 'x' * $_.Value.Length }
0123456789xxxxxxxxxxxxxxxxxxxx 3978 Smith st...
'(?<=^\d{10} 是一个正向的后向断言,它匹配前 10 个数字而不捕获它们,.{20} 匹配并捕获接下来的 20 个字符。
每次匹配都会调用脚本块,$_ 包含手头的匹配作为 [System.Text.RegularExpressions.Match] 实例; .Value 包含匹配的文本。
因此,'x' * $_.Value.Length 返回一个由 x 字符组成的字符串。与匹配的长度相同。
在 Windows PowerShell 中,您必须直接使用 [regex] type:
PS> [regex]::Replace('01234567890Alice Stone 3978 Smith st...',
'(?<=^\d{10}).{20}', { param($m) 'x' * $m.Value.Length })
0123456789xxxxxxxxxxxxxxxxxxxx 3978 Smith st...
如果要替换的子字符串的长度是提前知道的 - 就像你的情况一样 - 你可以更简单地做:
PS> $len = 20; '01234567890Alice Stone 3978 Smith st...' -replace
"(?<=^\d{10}).{$len}", ('x' * $len)
0123456789xxxxxxxxxxxxxxxxxxxx 3978 Smith st...
无条件地编辑所有字母更加简单:
PS> '01234567890Alice Stone 3978 Smith st...' -replace '\p{L}', 'x'
01234567890xxxxx xxxxx 3978 xxxxx xx...
\p{L} 匹配任何 Unicode 字母。
仅在匹配的子字符串中编辑字母需要嵌套 -replace 操作:
PS> '01234567890Alice Stone 3978 Smith st...' -replace
'(?<=^\d{10}).{20}', { $_ -replace '\p{L}', 'x' }
01234567890xxxxx xxxxx 3978 Smith st...