Question Regex pour newbie

Plus d'informations
il y a 16 ans 11 mois #4487 par Gabriel
Réponse de Gabriel sur le sujet Re:Regex pour newbie
Hello

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... :evil: ) et bon ca me permet de commencer a regarder les regex ;).

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.

Plus d'informations
il y a 16 ans 11 mois #4489 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Regex pour newbie
Salut,
tonic8 écrit:

par contre comment recuperer la valeur du champs, ca j'ai pas encore bien compris.

Soit on utilise directement la classe regex comme tu le fais soit l'opérateur match qui encapsule la méthode statique [regex]::match.
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 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..

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.
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.

Plus d'informations
il y a 16 ans 11 mois #4502 par Gabriel
Réponse de Gabriel sur le sujet Re:Regex pour newbie
:woohoo:

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]

B)
Merci Sensei<br><br>Message édité par: tonic8, à: 31/03/09 14:41

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

Plus d'informations
il y a 16 ans 11 mois #4505 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Regex pour newbie
tonic8 écrit:

Pour verifier \&quot;%\&quot; est le racourci foreach?

Oui
[code:1]
alias %
[/code:1]
tonic8 écrit:

Merci Sensei

\&quot;Merci Laurent\&quot; me semble suffisant ;)

tonic8 écrit:

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...

Non pas tout à fait, j'ai oublié de préciser que la clé , [1] ou \&quot;NomCapturé\&quot;, référence une capture.
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 (.*[^&gt;]) dans
[code:1]Name=\&quot;(.*[^&gt;])\&quot;[/code:1]
Qui signifie je prend la première occurence de :
tous les caractères entre des guillemets, excepté &gt;, et précédés de Name= jusqu'au premier caractère &gt;.

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=\&quot;test toto1 test toto2 test toto3\&quot;
#recherche la première occurence de : toto suivi d'un chiffre tout en étant précédé et suivi d'un espace
$r=\&quot;( toto. )\&quot;
$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=\&quot;( toto.\s?)\&quot;
[/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.

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