使用REGEX在捕获组中查找模式;现在我需要替换/修改找到的值。
尝试替换固定长度字段中的值:
要搜索的正则表达式:(\d{10})(.{20}) (.+)
。
字符串是:
01234567890Alice Stone 3978 Smith st...
我必须用X替换捕获组2(全名)(或者更好的是捕获组2中的名字和姓氏)
正则表达式:(\d{10})(.{20})(.+)
替换值$1xxxxxxxxxxxxxxxxxxxx$3
这有效,但是认为会有更好的解决方案(也许像$1 x{20} $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')