编辑捕获组值

Redacting capture group values

使用 REGEX 在捕获组中查找模式;现在我需要 replace/redact 找到的值。

尝试替换固定长度字段中的值:
要搜索的正则表达式:(\d{10})(.{20}) (.+)

字符串是:

01234567890Alice Stone          3978 Smith st...

我必须用 X 替换捕获组 2(全名)(或者更好,只是捕获组 2 中的名字和姓氏)

正则表达式:(\d{10})(.{20})(.+)

替换值xxxxxxxxxxxxxxxxxxxx

这行得通,但我认为会有一个更迷人的解决方案(可能像 x{20} )或什至更好,只是用其中的字母编辑值。

谢谢!

为了制定一个替换字符串,其长度应与输入字符串的一个(可能是可变长度的)子字符串相匹配,您需要动态计算替换字符串脚本块(代表)。

在 PowerShell Core 中,您现在可以直接传递脚本块作为 的替换操作数:

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 returns 一串 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...

也许,这个表达式是一个选项:

([0-9]{11}).+?(\s*[0-9].+)

替换为:

xxxxxxxxxxxxxxxxxxxx

If you wish to explore/simplify/modify the expression, it's been explained on the top right panel of regex101.com. If you'd like, you can also watch in this link, how it would match against some sample inputs.


你可以使用这个:

$oldstr = "0123456789Alice Stone 3978 Smith st..."
[regex]$r = '(\d{10})(.{20})(.+)'

$newstr = $r.Replace($data,''+'x'*20+'')

这里,'x'字符乘以20(有效重复20次)。

0123456789xxxxxxxxxxxxxxxxxxxxth st...

如其他人所示,捕获组 2 不是必需的,因此可以简化为:

[regex]$r = '(\d{10}).{20}(.+)'

$newstr = $r.Replace($data,''+'x'*20+'')