Question
Regex pour newbie
- Gabriel
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 248
- Remerciements reçus 1
Non en fait ta solution aurait fonctionner, puisqu'une fois \"convertit\", en utilisant XML-Path je recupere le nom du rapport. Mais comme cela passe pr un traitement de fichier, elle inclut obligatoirement des problemes (loi de Murphy...
La regex que tu m'a donné isole bien la ligne, je l'ai tester avec regexBuddy. par contre comment recuperer la valeur du champs, ca j'ai pas encore bien compris.
Je passe par une variable temporaire ou je stock la ligne complete (que je recuperer grace a ta regex), puis je procede a un regex de la ligne complete ou tout cela peut-il etre fait avec une seule variable? et donc une seule regex..
Cordialement
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
tonic8 écrit:
Soit on utilise directement la classe regex comme tu le fais soit l'opérateur match qui encapsule la méthode statique [regex]::match.par contre comment recuperer la valeur du champs, ca j'ai pas encore bien compris.
Dans ce cas la variable automatique, une hastable, $Matches est renseignée avec le résultat de l'expression réguliére effectué sur une chaîne ou un texte.
Elle contient les groupes numérotés ou nommés :
[code:1]
$r='<Report FilterString=.*[^>]><ReportInformation.*[^>] Name=\"(.*[^>])\".*[^>]=.*/>'
gc test.inf | Where { $_ -match $r }|% {$matches[1]}
#ou groupe nommé
$r='<Report FilterString=.*[^>]><ReportInformation.*[^>] Name=\"(?<NomCapturé>.*[^>])\".*[^>]=.*/>'
gc test.inf | Where { $_ -match $r }|% {$matches.NomCapturé}
[/code:1]
tonic8 écrit:
Je pense, mais sans code devant les yeux difficile de répondre. L'exemple proposé utilise le pipe ici pas besoin de variable, hormis la regex.Je passe par une variable temporaire ou je stock la ligne complete (que je recuperer grace a ta regex), puis je procede a un regex de la ligne complete ou tout cela peut-il etre fait avec une seule variable? et donc une seule regex..
Mais logiquement, enfin de ce que j'ai compris dans ton cas, tu ne devrais exécuter qu'une seule fois la regex.
Ensuite pour la présence ou non de variable intermédiaire c'est une histoire de compromis. Si tu les supprimes toutes, en cas de debug tu risques de devoir en ajouter pour tracer.
Mais là chacun voit midi à sa porte
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Gabriel
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 248
- Remerciements reçus 1
Les 2 marchent! si j'ai bien compris la premiere version (avec le numero), on peut choisir si il y a plusieurs occurences celle qu'on veut... ou proceder a une boucle...
Pour verifier \"%\" est le racourci foreach?
le dernier jet
[code:1]
$Chemin = \"C:\temp\"
$r='<Report FilterString=.*[^>]><ReportInformation.*[^>] Name=\"(?<NomCapturé>.*[^>])\".*[^>]=.*/>'
Foreach ($i in gci $Chemin -recurse -filter *.inf | % { $_.FullName }) {
gc $i | Where { $_ -match $r }|% {$matches.NomCapturé}
}
[/code:1]
Merci Sensei<br><br>Message édité par: tonic8, à: 31/03/09 14:41
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
OuiPour verifier \"%\" est le racourci foreach?
[code:1]
alias %
[/code:1]
tonic8 écrit:
\"Merci Laurent\" me semble suffisantMerci Sensei
tonic8 écrit:
Non pas tout à fait, j'ai oublié de préciser que la clé , [1] ou \"NomCapturé\", référence une capture.si j'ai bien compris la premiere version (avec le numero), on peut choisir si il y a plusieurs occurences celle qu'on veut... ou proceder a une boucle...
L'objectif d'une regex peut être de reconnaître une suite de caractères et/ou d'extraire une suite de caractères. Dans ce cas on parle de capture qui permet de récupérer le résultat.
La première clé est la ligne complète matchant la regex et la ou les secondes correspondent aux captures présentes, ici il y a un groupe capturant (.*[^>]) dans
[code:1]Name=\"(.*[^>])\"[/code:1]
Qui signifie je prend la première occurence de :
tous les caractères entre des guillemets, excepté >, et précédés de Name= jusqu'au premier caractère >.
Pour prendre toutes les occurences il faut utiliser la méthode matches qui n'est pas, à ma connaissance, encapsulé par un opérateur PowerShell.
[code:1]
$s=\"test toto1 test toto2 test toto3\"
#recherche la première occurence de : toto suivi d'un chiffre tout en étant précédé et suivi d'un espace
$r=\"( toto. )\"
$s -match $r # est ègal à [regex]::match($s,$r)
$Matches
#recherche toutes les occurences de : toto suivi d'un chiffre tout en étant précédé et suivi d'un espace
[regex]::matches($s,$r)
[/code:1]
Pour capturer la dernière occurence
[code:1]
#recherche toutes les occurences de : toto suivi d'un chiffre tout en étant précédé d'un espace et suivi de 0 ou 1 espace.
$r=\"( toto.\s?)\"
[/code:1]
[regex]::matches
Recherche dans une chaîne d'entrée toutes les occurrences d'une expression régulière et retourne toutes les correspondances exactes comme si Match avait été appelé plusieurs fois.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Regex pour newbie