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
...
Il suffit d'utiliser -replace
:
$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
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.
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]
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
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.