编辑捕获组值

时间:2019-08-21 04:17:17

标签: regex powershell redaction

使用REGEX在捕获组中查找模式;现在我需要替换/修改找到的值。

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

字符串是:

01234567890Alice Stone          3978 Smith st...

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

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

替换值$1xxxxxxxxxxxxxxxxxxxx$3

这有效,但是认为会有更好的解决方案(也许像$1 x{20} $3),或者更好的办法是用字母来修饰值。

谢谢!

3 个答案:

答案 0 :(得分:2)

为了制定替换字符串,其长度应与输入字符串的-可能是可变长度的-子字符串匹配,您需要通过 script块动态地计算替换字符串(委托)。

在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...

答案 1 :(得分:1)

也许,可以选择以下表达式:

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

,替换为:

$1xxxxxxxxxxxxxxxxxxxx$2

  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。


答案 2 :(得分:0)

您可以使用此:

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

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

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

  

0123456789xxxxxxxxxxxxxxxxxxxxth st ...

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

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

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