Question Regex et positionnement aléatoire de caractères

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

si elle se trouve positionné derrière une balise de type |OP|, |IP|, |MP| |PA| ou |IO| :

Ces balises sont-elles tjr en début de chaîne?
Peuvent-elles être dupliquées ?
La chaîne peut-elle en contenir plusieurs mais différentes ?

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 2 semaines #19686 par rocketter

Ces balises sont-elles tjr en début de chaîne?

Non, elles ne le sont jamais.

Peuvent-elles être dupliquées ?

Non il n'y en a qu'une par fichier

La chaîne peut-elle en contenir plusieurs mais différentes ?

Non juste une d'un seul type.

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

Plus d'informations
il y a 11 ans 2 semaines #19687 par xyz
Essaie ceci :
[code:1]
$BalisesRecherchees='|OP|','|IP|','|MP|','|PA|','|IO|'
#Test
$BalisesAutorisees='|RP|','|TP|','|PM|','|AP|','|IA|'

$T=$BalisesAutorisees+$BalisesRecherchees|
% {
@\"
20150421164500^${_}135F
A|~135~5110~4~C~67202|||M||||201504211646||
\"@
}

#Utilisé lors de la transformation du tableau en une chaîne
$oldOfs,$ofs=$ofs,\";\"
#Echappe les '|' puis construit une alternative
$Balises=[regex]::Escape($BalisesRecherchees).Replace(';','|')
$ofs=$oldOfs

#Regex + lookbehind
#(?<= ) :Est-ce que l'expression à trouver est-elle précédée d'une des balises recherchée ?
#($Balises).*? : on recherche zéro ou n caractères (le moins possible) entre la balise et l'expression
#(\n|\r|\r\n)A\| : expression recherchée
#\"(?<=($Balises).*?)(\n|\r|\r\n)A\|\" : construction de la regex de substitution

#Test
$T| % {Write-warning $_;$_ -replace \"(?<=($Balises).*?)(\n|\r|\r\n)A\|\", ''}
[/code:1]
Sous réserve : le caractère ';' ne doit pas se retrouver dans la chaîne à analyser.<br><br>Message édité par: Laurent Dardenne, à: 12/05/15 12:13

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 2 semaines #19688 par rocketter
Merci Laurent, ton code est complexe par contre.

je ne comprends pas ce que sont les balises autorisées :'|RP|','|TP|','|PM|','|AP|','|IA|' car je n'ai pas ces balises dans mes fichiers

Ensuite
[code:1]$oldOfs,$ofs=$ofs,\&quot;;\&quot;[/code:1]
Tu dis que c'est utilisé lors de la transformation du tableau en une chaîne.
Est ce une façon raccourcie d'écrire la méthode Join ?

[code:1]$Balises=[regex]::Escape($BalisesRecherchees).Replace(';','|')[/code:1]

C'est une méthode statique comme tu me l'as appris sur mon autre post. Mais cette ligne va remplacer des ; par des | ??

Je te remercie d'avance de tes réponses

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

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

ton code est complexe par contre.

Ton problème ne l'est pas moins :-)
rocketter écrit:

je ne comprends pas ce que sont les balises autorisées

C'est un jeux de test rapido, l'utilisation de regex nécessite de les valider par des exemples.
Ces balises d'exemples valident l'echec de la substitution (-Replace), puisqu'on ne recherche qu'un sous ensemble de balises.
rocketter écrit:

Est ce une façon raccourcie d'écrire la méthode Join ?

Oui, le code s'appuie implicitement sur des comportements de transformation de Powershell:
[code:1]
$T=1..5
$ofs='+'
#Transforme le tableau contenu dans la variable T en une chaine
\&quot;$T\&quot;
Invoke-Expression \&quot;$T\&quot;
#1+2+3+4+5=15
#ce que ne fait pas le code suivant
$T.ToString()
[/code:1]
On peut très bien arriver au même résultat en ajoutant du code intermédiaire.
Effectivment cette 'densité' freine la compréhension du code pour un débutant.
[code:1]
[regex]::Escape
#
# static string Escape(string str)
[/code:1]
Cette méthode attend une chaîne en paramètre.
$T est un tableau, PS tente de le transformer en une chaîne en utilisant $OFS pour séparer ses éléments.
rocketter écrit:

Mais cette ligne va remplacer des ; par des | ??

Oui, on peut renseigner directement la variable $OFS, mais ici on doit échapper le métacaractère '|' de la balise.
Je procéde donc en deux étapes via le principe du chaînage de méthode.

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 2 semaines #19690 par rocketter
Merci de tes précisions Laurent, j'y vois légèrement plus clair.
Donc ça veut dire qu'on est parti d'un tableau avec les différentes balises, ce tableau a été converti en string via $OFS et le caractère de séparation \&quot;;\&quot; , ensuite les pipes entourant chaque balise ont été échappés via la méthode Replace et les \&quot;;\&quot; qui séparaient chaque string ont été remplacé par des pipes c'est ça ?

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

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