【问题标题】:powershell How to capture 'left side' of the -replace regex?powershell 如何捕获-replace 正则表达式的“左侧”?
【发布时间】:2022-01-09 10:11:47
【问题描述】:

第一次发帖。

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

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

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

我想要做的是将实际左侧“源”正则表达式捕获到一个变量中,该变量将是@domain.com,以便我知道我正在替换什么,但我不知道如何去做吧。

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

谢谢

【问题讨论】:

  • $a -replace '^.*(?=@)', 'jane.doe'

标签: powershell replace


【解决方案1】:

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

这就是您可以直接使用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

【讨论】:

  • 你是个天才,我知道这是“我的联盟之外”的 powershell 技能 :),它非常有效。感谢您的快速回复。
  • @RobertK 谢谢 :) 并乐于提供帮助。现在我想知道这是否可能只使用-replace lol。
  • 如果微软的某个人可以回答这个问题,因为我为此苦苦挣扎了几天,因为我需要将这些旧域保存到文件中以保存。
  • @RobertK 看到我的更新,很明显,我不建议使用它嘿嘿
  • 感谢您进一步挖掘,但您的第一个答案非常完美。我将其保存在我的提示和技巧文件中。
【解决方案2】:

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

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

(?=@) 构造被称为lookahead,它在@ 之前的位置描述了一个零长度字符串。

【讨论】:

  • 我认为他试图在变量中捕获$0
  • 是的,我只想捕获 $0,换句话说,我如何才能看到实际的源替换搜索是什么,在我的情况下应该显示 @domain.com 字符串而不是剩下的在原始字符串中。希望这是有道理的。
猜你喜欢
  • 2016-11-10
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多