PowerShell使用-replace正则替换时如何捕获被替换的原匹配内容
实现方案
你可以先通过正则匹配提取待替换的原后缀内容存到变量,再执行替换操作,有两种常用的PowerShell原生实现方式:
方式1:使用-match操作符(推荐,写法更简洁)
-match匹配成功后会自动将捕获的内容存入系统自动变量$matches:
$a = 'john.doe@domain.com' $originalSuffix = $null # 匹配@及之后的所有内容,捕获存入$matches if ($a -match "@.*") { $originalSuffix = $matches[0] $b = $a -replace "@.*", '@testdomain.com' } # 输出验证 $originalSuffix # 得到原后缀:@domain.com $b # 得到替换后的结果:john.doe@testdomain.com
方式2:使用[regex]::Match静态方法
如果需要更灵活的正则匹配配置,可以用.NET的正则类直接提取匹配结果:
$a = 'john.doe@domain.com' # 直接提取匹配的原后缀 $originalSuffix = [regex]::Match($a, "@.*").Value # 执行替换 $b = $a -replace "@.*", '@testdomain.com'
补充说明
你原代码里的正则[?=@].*存在冗余,[?=@]的语义是匹配?、=、@三个字符中的任意一个,如果你确认输入的邮箱不会出现前两个特殊字符可以正常使用,更严谨的写法是直接用@.*匹配@符号之后的所有内容即可。
内容的提问来源于stack exchange,提问作者RobertK
相关产品推荐
相关产品推荐

