假设我有字符串“blah blah F12 blah blah F32 blah blah blah blah”我希望匹配 F12 和 F32 ,我将如何捕获两个Powershell魔法变量$ matches?
如果我在Powershell中运行以下代码:
$string = "blah blah F12 blah blah F32 blah blah blah"
$string -match "F\d\d"
$ matches变量只包含 F12
我也尝试过:
$string -match "(F\d\d)"
这次$ match有两个项目,但都是 F12
我希望$ match包含 F12 和 F32 以供进一步处理。我似乎无法找到办法。
非常感谢所有帮助。 :)
答案 0 :(得分:38)
您可以使用PowerShell 2.0中的Select-String执行此操作,如下所示:
Select-String F\d\d -input $string -AllMatches | Foreach {$_.matches}
前段时间我在MS Connect上遇到了asked for a -matchall
operator,这个建议因此评论已经关闭了:
“这是用select-string的-allmatches参数修复的。”
答案 1 :(得分:16)
我建议使用此语法,以便更轻松地处理匹配数组:
$string = "blah blah F12 blah blah F32 blah blah blah" ;
$matches = ([regex]'F\d\d').Matches($string);
$matches[1].Value; # get matching value for second occurance, F32
答案 2 :(得分:0)
我看到两种处理方式不同的场景:
(?<=jobs).*
Select-String
来处理这个问题,以便从下面举例说明的输出中获取游牧作业的 ID$m = "Watch the deployment in realtime at: https://nomad.foo.net/ui/jobs/20e183af-8243-11eb-a2af-0a58a9feac2a
08:23
Watch the deployment in realtime at: https://nomad.foo.net/ui/jobs/20e130e9-8243-11eb-a2af-0a58a9feac2a"
$r = "(?<=jobs/).*"
$l = Select-String $r -InputObject $m -AllMatches |
Foreach {$_.matches.Value}
20e183af-8243-11eb-a2af-0a58a9feac2a
20e130e9-8243-11eb-a2af-0a58a9feac2a
$l[0]
>>> 20e183af-8243-11eb-a2af-0a58a9feac2a
▶ $s = "Hello World from Mr Pavol"
▶ $r = "(World).*(Pavol)"
▶ $s -match $r
True
▶ $Matches
Name Value
---- -----
2 Pavol
1 World
0 World from Mr Pavol
答案 3 :(得分:-1)
$String = @'
MemberProgram PackageID="12345678" ProgramName="Install"/
MemberProgram PackageID="87654321" ProgramName="Install"/
MemberProgram PackageID="21436587" ProgramName="Install"/
MemberProgram PackageID="78563412" ProgramName="Install"/
'@
([regex]'(?<=PackageID=\")\d+(?=\")').Matches($String).value