Question Regex et positionnement aléatoire de caractères

Plus d'informations
il y a 11 ans 2 semaines #19691 par xyz
rocketter écrit:

c'est ça ?

Oui, bien que ce soit la méthode Escape et non pas Replace.
On peut très bien coder directement la regex, pour moi l’intérêt est qu'on peut modifier le tableau de balises sans modifier le code.
Une fois qu'on connait cette technique on la réutilise sans se poser de question.

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 1 semaine #19692 par rocketter
Oui au temps pour moi c'est la méthode Escape. Ta technique est intéressante en tout cas effectivement.

Par contre je ne comprends pas l'utilité de cette ligne :[code:1]$ofs=$oldOfs[/code:1] ?

et concernant sinon ta regex :
[code:1](?<=($Balises).*?)[/code:1]

Est ce que dans .*? ; le \"?\" n'est pas en trop ? Car finalement .* signifiant n'importe quel caractère présent 0 ou plusieurs fois. Le \"?\" n'est-il pas superflu ?

Sinon je te remercie du coup de main :) , j'vois que t'es un adepte des méthodes statiques :)

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

Plus d'informations
il y a 11 ans 1 semaine #19693 par xyz
rocketter écrit:

Par contre je ne comprends pas l'utilité de cette ligne :[code:1]$ofs=$oldOfs[/code:1]

Je réaffecte la valeur initiale, c'est une habitude qui évite les surprises aux utilisateurs.
Si on utilise un script/fonction dans sa propre portée, ce n'est pas nécessaire, mais on ne sait jamais ce que fait l'utilisateur d'un code.
Je m'efforce de laisser le contexte dans l'état où je l'ai trouvé.
rocketter écrit:

Est ce que dans .*? ; le \"?\" n'est pas en trop ?

Si, pour ce cas ce n'est pas nécessaire.
rocketter écrit:

j'vois que t'es un adepte des méthodes statiques

Je suis surtout un adepte de ce qui me sert :)

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 1 semaine #19695 par rocketter
Je te remercie de ton aide Laurent, je n'ai plus qu'à adapter ça à mon cas. J'aurais appris beaucoup de choses en tout cas :)

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

Plus d'informations
il y a 11 ans 1 semaine #19701 par rocketter
Arf j'ai encore une question, c'est plus pour ma culture perso du coup car je pourrais faire autrement pour que le programme marche, mais en gros j'aimerais savoir pourquoi ceci fonctionne :

Code simplifié :
[code:1]$BalisesRecherchees='|OP|','|IP|','|MP|','|PA|','|IO|'

$oldOfs,$ofs=$ofs,\";\"
$Balises=[regex]::Escape($BalisesRecherchees).Replace(';','|')
$ofs=$oldOfs

$T = @\"
\"qsmldkqpsdokjq|poqskjdpdjpqosjkd|poqskjpokqjd||MP|12345
A|65464654\"
\"@

$T| select-string \"(?<=($Balises).*?)(\n|\r|\r\n)A\|\" -quiet[/code:1]

Avec le paramètre quiet de select-string, le résultat est True, ce qui est exact.

Mais avec ce code :
[code:1]$BalisesRecherchees='|OP|','|IP|','|MP|','|PA|','|IO|'

$oldOfs,$ofs=$ofs,\";\"

$Balises=[regex]::Escape($BalisesRecherchees).Replace(';','|')
$ofs=$oldOfs

(get-childitem –Path \"c:\test.hpr\"«»)| select-string \"(?<=($Balises).*?)(\n|\r|\r\n)A\|\" -quiet[/code:1]

Mon booléen est à False, alors que le contenu de test.hpr est exactement le même que celui de la variable $T.

Je ne comprends pas du tout :ohmy: :blink: :side:

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

Plus d'informations
il y a 11 ans 1 semaine #19702 par xyz
rocketter écrit:

alors que le contenu de test.hpr est exactement le même que celui de la variable $T.

Ton affirmation est ici erronée.
Il faut connaitre le Parameter Binding (liaison de paramètre), un des principes de base de Powershell.
[code:1]
Trace-Command ParameterBinding {(get-childitem -Path \"c:\test.hpr\"«»)| select-string \"(?<=($Balises).*?)(\n|\
r|\r\n)A\|\" -quiet } -pshost
[/code:1]
Qui renvoi le détail de cette liaison:

...
DÉBOGUER : ParameterBinding Information: 0 : CALLING BeginProcessing
DÉBOGUER : ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Select-String]
DÉBOGUER : ParameterBinding Information: 0 : PIPELINE object TYPE = [System.IO.FileInfo]
DÉBOGUER : ParameterBinding Information: 0 : RESTORING pipeline parameter's original values
DÉBOGUER : ParameterBinding Information: 0 : Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
DÉBOGUER : ParameterBinding Information: 0 : BIND arg [C:\test.hpr] to parameter [InputObject]
DÉBOGUER : ParameterBinding Information: 0 : BIND arg [C:\test.hpr] to param [InputObject] SUCCESSFUL
DÉBOGUER : ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Select-String]

La ligne qui nous intéresse :

BIND arg [C:\test.hpr] to param [InputObject] SUCCESSFUL

Pour la comprendre il faut savoir lire l'aide en ligne :
[code:1]
help select-string -Parameter inputobject
#...
#Accepter l'entrée de pipeline ? true (ByValue)
#...
[/code:1]
PS récupère un objet fichier et le passe au paramètre $InputObject via le pipeline (PS le transforme en une String).

Tu lui passes le nom du fichier pas son contenu ;)
Voir aussi ce bug et les autres :lol: .<br><br>Message édité par: Laurent Dardenne, à: 14/05/15 12:43

Tutoriels PowerShell

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

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