PowerShell使用正则提取IP转MD5时出现多余输出如何解决?
问题原因
你遇到的多余输出由两个问题共同导致:
- 正则表达式中使用了默认的捕获分组,所有被
()包裹的规则片段都会生成独立的捕获结果,和完整匹配一起返回到Groups集合中,你看到的41、空值都是分组捕获的片段内容 - 遍历逻辑直接遍历了Groups集合的所有项,没有只取完整匹配的分组
解决方案
第一步:修改正则为非捕获分组
把所有不需要单独提取的分组改为非捕获格式(?:xxx),避免生成多余的捕获结果,修改后的正则为:\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.|$)){4}\b
第二步:调整遍历逻辑
[regex]::Matches返回的是所有匹配结果的集合,每个匹配结果的Groups[0]固定为完整匹配的内容,直接提取即可。
修正后完整代码
$s = "IPA:10.51.5.41" $q="\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.|$)){4}\b" $matches = [regex]::Matches($s, $q) # 遍历所有匹配到的完整IP foreach ($match in $matches) { $ip = $match.Groups[0].Value Write-Host "num is $ip" $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $utf8 = New-Object -TypeName System.Text.UTF8Encoding $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($ip))) Write-Host "hash is $hash" }
输出结果
num is 10.51.5.41 hash is AE-B5-C4-0C-27-83-74-33-55-E4-6B-A2-BE-5A-35-F6
内容的提问来源于stack exchange,提问作者MarksBogdanovics
相关产品推荐
相关产品推荐

