You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

代码解释

  1. 正则逻辑:

    • (?<=Equal\s"):正向零宽断言,确保我们要匹配的内容前面是Equal (带空格)加双引号,避免误匹配其他位置的内容
    • ([^"]+):捕获所有不是双引号的字符,这样就能精准拿到引号里的内容,包括带空格的server03 test
  2. 匹配方法:

    • 用Matches()而不是Match(),这样能获取所有符合条件的匹配项,而不是只拿第一个
  3. 结果处理:

    • 把所有匹配到的值用-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:22:22