如何从单行捕获多个正则表达式匹配到Powershell中的$ matches magic变量?

时间:2010-06-29 14:49:04

标签: regex powershell powershell-v2.0

假设我有字符串“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 以供进一步处理。我似乎无法找到办法。

非常感谢所有帮助。 :)

4 个答案:

答案 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)

我看到两种处理方式不同的场景:

  1. 提取单个模式的所有匹配项
  2. 提取多个模式的单个匹配

1.提取一个模式的所有匹配项:select-string + -allmatches

  • 例如正则表达式:(?<=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

2.提取一个/多个模式的单个/第一个匹配项:捕获组和 $Match[]

▶ $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