powershell -Replace运算子撷取群组会提供撷取子字串的反转

yzckvree  于 2022-12-04  发布在  Shell
关注(0)|答案(1)|浏览(128)

在下面的例子中,我希望得到;[rr] [Delete]的输出,但实际上我得到的是getting Sendinput, {F3}

$Name = "Sendinput, {F3}            ;[rr] [Delete]"
$name -replace "(;\[rr\].*)", "$1"    
Sendinput, {F3}

这不是一个捕获组吗??我很困惑,我会做错什么呢?

bfnvny8b

bfnvny8b1#

问题是双引号而不是单引号,PowerShell将$1解释为变量而不是捕获组(变量在双引号字符串中展开),由于变量未定义,因此它实际上将正则表达式匹配替换为null。
但是,您还希望将所有内容替换为捕获组1,因此您的正则表达式应该如下所示:

$name = 'Sendinput, {F3}            ;[rr] [Delete]'
$name -replace '.+(;\[rr\].*)', '$1'

有关详细信息,请参阅https://regex101.com/r/ikQzhc/1
值得注意的是,您可以使用-matchRegex.Match来执行此操作:

if($name -match ';\[rr\].*') { $Matches[0] }

# or 

[regex]::Match($name, ';\[rr\].*').Value

相关问题