Powershell 如何捕获 -replace 正则表达式的'left side'?



第一次发布。

我有以下代码来替换电子邮件的后缀及其工作正常

将 @ 符号后的所有字符替换为 @testdomain.com

$a = 'john.doe@domain.com'
$b = $a -replace "[?=@].*", '@testdomain.com'
$b
john.doe@testdomain.com

我想做的是将实际的左侧"源"正则表达式捕获到一个变量中,该变量将是@domain.com,以便我知道我正在替换什么,而我不知道;不知道该怎么做。

对不起,如果这之前已经发布过。

谢谢

因此,我不确定仅使用-replace运算符而不使用将捕获组存储在$Matches自动变量上的-match

是否可以做到这一点。这是直接使用regex类的方法:

$a = 'john.doe@domain.com'
$Capture = @{}
$b = [regex]::Replace($a, "[?=@].*", {
param($s)

'@testdomain.com'
$Capture.Value = $s.Value
})
$b # => john.doe@testdomain.com
$Capture.Value # => @domain.com

这是我只能使用-replace想到的,在替换的字符串中添加一个分隔符(在本例中//),然后是捕获组$0然后拆分替换。但是,这显然不是一个强大的解决方案。

$a = 'john.doe@domain.com'
$b, $capture = $a -replace "[?=@].*", '@testdomain.com//$0' -split '//'
$b # => john.doe@testdomain.com
$capture # => @domain.com

要更改用户部分,您可以替换^.*(?=@)

PS ~> $a = 'john.doe@domain.com'
PS ~> $a -replace '^.*(?=@)', 'jane.doe'
jane.doe@domain.com

(?=@)构造称为前瞻,它描述紧靠@之前位置的零长度字符串。

相关内容

最新更新