Question Extraction d'une partie d'une chaine (Résolu)

Plus d'informations
il y a 17 ans 3 mois #3313 par Gérard Langlois
Voilà mon problème, j'ai la chaine de la forme suivante :

[code:1]$toto = \"TEMP = 10:11:12\"[/code:1]

Je voudrais en extraire \"10:11:12\". Je pensais utiliser une regexp et la notion de groupe.
Par exemple quelque chose du genre:
[code:1]
TEMP = \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\)[/code:1]
Je pourrai alors récupérer la partie qui match le groupe [code:1]
[0-9][0-9]:[0-9][0-9]:[0-9][0-9][/code:1]

Cependant je n'ai pas vu la notion de groupe dans les regexp powershell. Je me trompe ?

Je suis obligé de passer par la méthode Split?

Message édité par: Arnaud, à: 27/11/08 22:33<br><br>Message édité par: Arnaud, à: 9/12/08 23:24

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3316 par Laurent Dardenne
gla écrit:

Cependant je n'ai pas vu la notion de groupe dans les regexp powershell. Je me trompe ?

Oui et non, il faut regarder dans les possibilités de .NET. Bien qu'il existe l'opérateur Match et la variable automatique $Matches.
Il encapsule la classe Regex ,
[code:1]
$toto = \&quot;TEMP = 10:11:12\&quot;
#3+1 groupes
$MatchTmp =[Regex]::Match($toto,'^TEMP = (\d{1,2}):«»(\d{1,2}):«»(\d{1,2})$')
if ($MatchTmp.Success -eq $true)
{
foreach ($S in $MatchTmp.groups)
{ $S.Value}
}
#1+1 groupes
if ($toto -match '^TEMP = (\d{1,2}:\d{1,2}:\d{1,2})$' )
{$matches}
#1+1 groupes nommés
if ($toto -match '^TEMP = (?&lt;un&gt;\d{1,2}):«»(?&lt;deux&gt;\d{1,2}):«»(?&lt;trois&gt;\d{1,2})$')
{$matches[\&quot;un\&quot;]
$matches[\&quot;deux\&quot;]
$matches[\&quot;trois\&quot;]}
[/code:1]
Recherche sur le forum tu y trouveras un post référençant qq articles sur le sujet des regex sous PS.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3329 par Robin Lemesle
Effectivement, powershell n'inclut pas de nouvelles regex. Comme le dit si bien laurent, il faut regarder du coté de .Net sur le web lgmorand.developpez.com/dotnet/regex/ .

Robin MVP PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3332 par Arnaud Petitjean
Salut !

Si le test du contenu de ta chaine n'est pas indispensable, le plus simple serait de faire un simple split, comme ceci :

[code:1]
PS &gt; $toto = \&quot;TEMP = 10:11:12\&quot;
PS &gt; $toto.split(' ')[2]
10:11:12
[/code:1]

@+

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3396 par Gérard Langlois
Merci à tous pour votre aide.

J'avais contourné le problème en utilisant
[code:1]
$toto = \&quot;TEMP = 10:11:12\&quot;
$toto.Replace(\&quot;TEMP = \&quot;,\&quot;\&quot;«»)
[/code:1]
Ce n'était pas très propre mais ça marchait.

Depuis l'aide de Laurent, j'utilise les regex. Cela permet de faire d'avantage de contrôles

Merci

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.105 secondes
Propulsé par Kunena