2010-06-29 7 views
15

Disons que j'ai la chaîne « bla bla F12 bla bla F32 bla bla bla » et je veux correspondre à la F12 et F32, comment pourrais-je aller sur la capture à la fois à la variable magique Powershell matchs de $?

Si je lance le code suivant dans Powershell:

$string = "blah blah F12 blah blah F32 blah blah blah" 
$string -match "F\d\d" 

Le $ correspond à la variable ne contient F12

J'ai essayé aussi:

$string -match "(F\d\d)" 

Cette fois les matchs de $ avaient deux articles, mais les deux sont F12

Je voudrais que les correspondances $ contiennent à la fois F12 et F32 pour un traitement ultérieur. Je n'arrive juste pas à trouver un moyen de le faire.

Toute aide serait grandement appréciée. :)

+0

ceux qui se demandent pourquoi '-match' retourne deux _F12_ résultats dans la deuxième tentative, c'est parce que _F12_ est à la fois le résultat de l'expression de correspondance _whole_ ET le résultat du premier groupe de correspondance dans l'expression (le résultat des parenthèses ... –

Répondre

31

Vous pouvez le faire en utilisant Select-String dans PowerShell 2.0 comme ceci:

Select-String F\d\d -input $string -AllMatches | Foreach {$_.matches} 

y a quelque temps que j'avais asked for a -matchall operator sur MS Connect et cette suggestion a été fermé comme fixé avec ce commentaire:

"Ceci est corrigé avec le paramètre -allmatches pour la chaîne de sélection."

+0

C'était exactement ce dont j'avais besoin, merci beaucoup :) :) – Etzeitet

+0

Alors, comment faites-vous référence aux valeurs capturées, à partir de Select-String -AllMatches? –

+5

@NathanHartley '$ chaîne | Select-String "(F \ d \ d)" -AllMatches | % correspond à | % Value' –

12

Je suggère d'utiliser cette syntaxe comme il est plus facile de gérer votre liste de fonctions:

$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