2

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

尝试替换固定长度字段中的值:
REGEX to search: (\d{10})(.{20}) (.+)

字符串是:

01234567890Alice Stone          3978 Smith st...

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

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

替换值$1xxxxxxxxxxxxxxxxxxxx$3

这行得通,但认为会有一个更迷人的解决方案(也许像$1 x{20} $3),或者甚至更好地以某种方式只是用其中的字母编辑值。

谢谢!

4

3 回答 3

2

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

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

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]类型

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...
于 2019-08-21T04:41:25.687 回答
1

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

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

替换将是:

$1xxxxxxxxxxxxxxxxxxxx$2

如果您想探索/简化/修改表达式,它已在 regex101.com的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。


于 2019-08-21T04:41:39.000 回答
0

你可以使用这个:

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

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

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

0123456789xxxxxxxxxxxxxxxxxxxxxxx...

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

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

$newstr = $r.Replace($data,'$1'+'x'*20+'$2')
于 2019-08-21T04:44:54.183 回答