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

powershell How to capture 'left side' of the -replace regex?

第一次发帖。

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

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

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

我想做的是将实际的左侧 'source' 正则表达式捕获到一个变量,这将是 @domain.com 这样我就知道我正在替换什么,我不知道该怎么做。

抱歉,如果之前已经发布过。

谢谢

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

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

(?=@) 构造被称为 前瞻 ,并在 @.[=14 之前的位置描述了一个零长度字符串=]

所以,我不确定仅使用 -replace 运算符而不使用 -match 是否可以将捕获组存储在 $Matches 自动变量上.

这是直接使用 regex class 的方法:

$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 时的想法,将分隔符(在本例中为 //)添加到替换字符串后跟捕获组 [=20=],然后拆分替换.不过,这显然不是一个可靠的解决方案。

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