web-dev-qa-db-fra.com

Correspondance d'expression régulière dans PowerShell

Y at-il un one-liner élégant pour faire ce qui suit?

$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]

Je suis intéressé par la variable $myVar ...

20
ted

Il suffit d'utiliser -replace:

$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
22
stej

J'utilise quelque chose comme ce qui suit assez souvent: 

([regex]"^abc(.*)").match($foo).groups[1].value

Ce n'est pas très PowerShell-y, ou du moins pas très PowerShell V2-y (nous retombons sur la classe .NET) ... mais c'est assez compact. 

17
Daniel Richnak

Réponse modifiée après clarification:

Vrai one-liner:

 $ myvar = ($ foo |? {$ _ -match $ myMatch} | select @ {L = "Correspondances"; E = {$ correspond [1]}}) correspond.

Faux one-liner:

 $ foo | ? {$ _ -match $ myMatch}; $ myvar = $ correspond à [1] 
3
Emiliano Poggi

Je ne suis pas sûr de l'élégance, mais voici quelque chose d'utile:

PS > "123.134" -match "(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})"
True
PS > $Matches

Name                           Value
----                           -----
P2                             134
P1                             123
0                              123.134


PS > $Matches["P1"]
123

?<P1> donne l'étiquette P1 à la première capture. Cela aide à comprendre.

PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches("123.123")[0].groups["P1"].value
123

Dans ton cas:

PS > $foo = "123.143"
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches($foo)[0].groups["P1"].value
123
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches($foo)[0].groups["P2"].value
143
2
JPBlanc

Enveloppez-le dans une fonction.

C'est presque toujours la bonne réponse si vous êtes déjà satisfait et comprenez une solution qui fonctionne mais que vous avez besoin qu'elle soit plus courte. Si la fonction est nommée correctement, elle commence également à produire du code auto-documenté et réutilisable. Qu'est-ce qui pourrait être mieux?

Même si vous êtes certain qu’il existe une solution plus élégante ou plus efficace, vous pouvez tout d’abord en faire un appel de fonction, puis si l’autre solution se présente, vous n’avez qu’à la modifier à un endroit: la définition de la fonction lui-même. Vous pouvez même ensuite brancher et sortir différentes options pour tester la fiabilité de tous vos cas d'utilisation. Qu'est-ce qui pourrait être mieux?

D'autres peuvent se plaindre de la surcharge d'appels de fonction, mais ce n'est vraiment pas le bon stade de développement ni le bon type ou langage de programmation pour s'en préoccuper. Déboguer une tentative ratée de "mignon" one-line sur la route compensera toujours le coût d'un appel de fonction propre et agréable. De bonnes décisions maintenant sur les API d'appels de fonction propres peuvent ensuite transformer des fonctions en méthodes de classe et les classes elles-mêmes peuvent envelopper de manière transparente des techniques de mise en cache et d'optimisation de haut niveau. L'optimisation de niveau inférieur des appels de fonction doit être laissée aux langages de niveau inférieur.

0
asmoore82