如何通过PowerShell正则表达式提取TXT文件中的指定服务器名称
解决PowerShell从字符串中提取多个Equal后的值的问题
你的原代码有几个小问题导致无法正确提取所有目标值:
- 用了贪婪匹配的
(.*),会把第一个Equal到最后一个OR之间的所有内容都抓过来,而不是单个值 - 只调用了
Match()方法,只能拿到第一个匹配项,漏掉了后面的server02和server03 test - 没处理最后一个没有
OR结尾的项,而且匹配结果会包含多余的空格和引号
我给你调整一下正则和代码逻辑,就能完美提取所有目标值了:
完整解决方案代码
# 你的原始字符串 $String = 'Host Class INCLUDE vmware:/?filter=Displayname Equal "server01" OR Displayname Equal "server02" OR Displayname Equal "server03 test"' # 定义正则:匹配Equal空格引号后的所有非引号内容 $Regex = [Regex]::new('(?<=Equal\s")([^"]+)') # 获取所有匹配结果 $allMatches = $Regex.Matches($String) # 提取每个匹配的值,用空格连接成最终结果 $extractedValues = $allMatches.Value -join ' ' # 输出结果 Write-Output $extractedValues
代码解释
正则逻辑:
(?<=Equal\s"):正向零宽断言,确保我们要匹配的内容前面是Equal(带空格)加双引号,避免误匹配其他位置的内容([^"]+):捕获所有不是双引号的字符,这样就能精准拿到引号里的内容,包括带空格的server03 test
匹配方法:
- 用
Matches()而不是Match(),这样能获取所有符合条件的匹配项,而不是只拿第一个
- 用
结果处理:
- 把所有匹配到的值用
-join ' '连接成空格分隔的字符串,正好符合你想要的输出格式
- 把所有匹配到的值用
更简洁的写法(用Select-String)
如果你喜欢更简洁的PowerShell风格,也可以这样写:
$String = 'Host Class INCLUDE vmware:/?filter=Displayname Equal "server01" OR Displayname Equal "server02" OR Displayname Equal "server03 test"' $String | Select-String -Pattern '(?<=Equal\s")([^"]+)' -AllMatches | ForEach-Object { $_.Matches.Value } -join ' '
两种写法最终都会输出:server01 server02 server03 test
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

