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
第一次发帖。
我有以下代码来替换电子邮件的后缀并且它工作正常
将@符号后的所有字符替换为@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