Question
Regex et positionnement aléatoire de caractères
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Ces balises sont-elles tjr en début de chaîne?si elle se trouve positionné derrière une balise de type |OP|, |IP|, |MP| |PA| ou |IO| :
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.
- rocketter
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 46
- Remerciements reçus 0
Non, elles ne le sont jamais.Ces balises sont-elles tjr en début de chaîne?
Non il n'y en a qu'une par fichierPeuvent-elles être dupliquées ?
Non juste une d'un seul type.La chaîne peut-elle en contenir plusieurs mais différentes ?
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
[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.
- rocketter
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 46
- Remerciements reçus 0
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,\";\"[/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.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Ton problème ne l'est pas moinston code est complexe par contre.
rocketter écrit:
C'est un jeux de test rapido, l'utilisation de regex nécessite de les valider par des exemples.je ne comprends pas ce que sont les balises autorisées
Ces balises d'exemples valident l'echec de la substitution (-Replace), puisqu'on ne recherche qu'un sous ensemble de balises.
rocketter écrit:
Oui, le code s'appuie implicitement sur des comportements de transformation de Powershell:Est ce une façon raccourcie d'écrire la méthode Join ?
[code:1]
$T=1..5
$ofs='+'
#Transforme le tableau contenu dans la variable T en une chaine
\"$T\"
Invoke-Expression \"$T\"
#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:
Oui, on peut renseigner directement la variable $OFS, mais ici on doit échapper le métacaractère '|' de la balise.Mais cette ligne va remplacer des ; par des | ??
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.
- rocketter
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 46
- Remerciements reçus 0
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 \";\" , ensuite les pipes entourant chaque balise ont été échappés via la méthode Replace et les \";\" qui séparaient chaque string ont été remplacé par des pipes c'est ça ?
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Regex et positionnement aléatoire de caractères