Page 1 sur 2

[R]Récupérer une chaîne délimitée

Posté : sam. 31 mars 2018 20:59
par camil
Bonjour,

Je souhaiterai récupéré une chaîne délimitée en les 2 valeurs FC et 0A, mais il me manque quelque chose dans ma syntaxe car je ne veux pas le FC et 0A dans le récupération de ma variable.
$chaine = "0x000000FCDEBUT***************FIN0A2000C3"
$resul = StringRegExpReplace($chaine, "(?i).+FC(.+0A).+", "\1")
MsgBox(0, "", $resul)
Merci d'avance pour l'aide...

Re: [..]Récupérer une chaîne délimitée

Posté : sam. 31 mars 2018 21:24
par Tlem
Bonsoir. Il y a probablement mieux, mais ceci fonctionne :

Code : Tout sélectionner

$chaine = "0x000000FCDEBUT***************FIN0A2000C3"
$resul = StringRegExp($chaine, "(?i)(FC)(.*)(0A)", 1)
MsgBox(0, "", $resul[1])

Re: [..]Récupérer une chaîne délimitée

Posté : sam. 31 mars 2018 21:38
par camil
Merci beaucoup ça répond a mon problème.
bonne soirée.

Re: [R]Récupérer une chaîne délimitée

Posté : sam. 31 mars 2018 23:04
par orax

Code : Tout sélectionner

$resul = StringRegExpReplace($chaine, "(?i).*FC(.+)0A.*", "\1")
C'était presque bon avec StringRegExpReplace. Il suffisait juste de déplacer une parenthèse.

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 12:56
par camil
Bonjour,

Je galère encore, ma chaîne se pressente toujours dans la même organisation .
Je souhaiterai récupérer TEST 1 entre FF et 0A mais il y a une série de 6 fois FF qui sont placées avant et bizarrement je récupère les valeurs après aussi. Pour TEST 2 pas de problème.
#include <String.au3>

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A424144424144"

$test1 = StringRegExp($chaine, "(?i)(FF)(.*)(0A)", 1)
$test2 = StringRegExp($chaine, "(?i)(FC)(.*)(0A)", 1)

$testA = $test1[1]
$testB = $test2[1]

$test1 = _HexToString($testA)
$test2 = _HexToString($testB)

MsgBox(0, "", $test1 & @CRLF & @CRLF & $test2)
Merci d'avance pour l'aide...

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 13:10
par orax
Le code de mon message précédent (#4) devrait marcher.

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 13:54
par camil
Oui et merci, effectivement ça fonctionne, mais il ne s’arrête pas la première valeur 0A qu'il rencontre. Il faut récupérer une chaîne de valeurs qui est entre [FF, 0A] = "TEST 1" et rien d'autre.

#include <String.au3>

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A4241444241440A"

$test1 = StringRegExpReplace($chaine, "(?i).+FF(.+)0A.+", "\1")
$test2 = StringRegExpReplace($chaine, "(?i).+FC(.+)0A.+", "\1")

MsgBox(0, "En HEX", $test1 & @CRLF & @CRLF & $test2)

$test1 = _HexToString($test1)
$test2 = _HexToString($test2)

MsgBox(0, "En ASCII", $test1 & @CRLF & @CRLF & $test2)

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 13:59
par Tlem
Bonjour Camil.
Il serait bien d'inventorier toutes les possibilités qui font qu'un code fonctionne ou pas.
Donnez un maximum d'exemples de lignes et faites en sorte que la partie qui doit être récupérée apparaisse facilement à nos yeux (changez la couleur par exemple).

Avec une certaine quantité d'exemple nous arriveraons sans doute à trouver une solution. ^^

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 14:16
par camil
J'ai refait l'exemple #7 et fait un exemple plus simple. Je dois récupérer la valeur hexadécimal "544553542031" pour avoir la valeur ascii "TEST 1".

#include <String.au3>

$chaine = "FFFFFF44424144FF5445535420310A4241440A4241440A424144"

$hex = StringRegExpReplace($chaine, "(?i).+FF(.+)0A.+", "\1")

$ascii = _HexToString($hex)

MsgBox(0, "Réponse", "HEX : " & $hex & @CRLF & @CRLF & "ASCII : " & $ascii )

Merci,

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 15:30
par Tlem
Comme je vous l'ai dit, idéalement il faudrait analyser un peut plus les cas qui peuvent poser problème !!!

Ceci dit, pour les cas que vous présentez, voici quelque chose qui fonctionne :

Pour le cas [FC, 0A] :

Code : Tout sélectionner

$chaine = "0x000000FCDEBUT***************FIN0A2000C3"
$resul = StringRegExp($chaine, "(?i)(.*FC)(.*)(0A.*)", 1)
MsgBox(0, "", $resul[1]
Pour le cas [FF, 0A] :

Code : Tout sélectionner

$chaine = "FFFFFF44424144FF5445535420310A4241440A4241440A424144"
$resul = StringRegExp($chaine, "(?i)(.*FF)(.*)(0A.*)", 1)
MsgBox(0, "", $resul[1])
Techniquement, le motif de l'expression régulière (?i)(.*FF)(.*)(0A.*) permet de décomposer la chaine traitée en trois groupes comme ceci :
Groupe 1 : (.*FF) = Tous les caractères de gauche, jusqu'au dernier FF trouvé (sous entendu avant le premier 0A grâce au groupe 3)
Groupe 2 : (.*) = Tous ce qui ce trouve entre le groupe 1 et le groupe 2
Groupe 3 : (0A.*) = Le premier 0A trouvé (sous entendu après groupe 1 et 2) + tous les caractères jusqu'a la fin de la chaîne.

Vu que vous travaillez sur des chaines hexadécimale, la gestion de la casse n'est pas nécessaire et comme je suppose que vous vous moquez de récupérer le début et la fin de la chaîne, du coup, vous pouvez simplifier à :

Code : Tout sélectionner

$chaine = "FFFFFF44424144FF5445535420310A4241440A4241440A424144"
$resul = StringRegExp($chaine, ".*FF(.*)0A.*", 1)
MsgBox(0, "", $resul[0])
Ou si vous tenez absolument au StringRegExpReplace :

Code : Tout sélectionner

$resul = StringRegExpReplace($chaine, ".*FF(.*)0A.*", "\1")

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 15:53
par orax
Si je comprends bien, il faut s'arrêter à la première occurrence de 0A. Donc ce n'est pas (.+) mais (.+?).

Code : Tout sélectionner

#include <String.au3>

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A424144424144"

$test1 = StringRegExpReplace($chaine, ".*FF(.+?)0A.*", "\1")
$test2 = StringRegExpReplace($chaine, ".*FC(.+?)0A.*", "\1")

$test1 = _HexToString($test1)
$test2 = _HexToString($test2)

ConsoleWrite($test1 & @CRLF & $test2 & @CRLF) ; affiche "TEST 1 TEST 2"

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 18:11
par camil
Merci j'ai avancé dans mes problèmes de syntaxe, mais je flanche sur se problème.
1.Je récupère bien une chaîne entre [FF00544553542031000000424144000A] = recup1
2.Il faut que je récupère dans recup1 une chaîne entre [0054455354203100] = recup2
C'est sur l’étape 2 que sa coince, la récupération entre la première valeur 00 et la valeur 00 suivante de la variable recup1.

#include <String.au3>

$chaine = "FFFF424144FF00544553542031000000424144000A424144"
$recup1 = StringRegExpReplace($chaine, ".*FF(.+?)0A.*", "\1")
$recup2 = StringRegExpReplace($recup1, ".*00(.+?)00.*", "\1")
$recup3 = _HexToString($recup2)
MsgBox(0, "Réponse", $recup1 & @CRLF & @CRLF & $recup2 & @CRLF & @CRLF & $recup3)

Encore merci

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 18:43
par Tlem
Un exemple détaillé de ce que vous voulez serait appréciable.
Donnez-nous plus de détails sur ce que vous ne voulez pas garder ...

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 20:07
par camil
Je veux récupérer "544553542031" dans une variable pour ses 2 exemples.

1er cas entre FF00recup0A. (la pas de problème, et encore merci)

"FFFF424144FF005445535420310A424144"

2ème cas entre FF00recup00 des bricoles et 0A. (la je bloque, le bleu j'en veux pas)

"FFFF424144FF00544553542031000000424144000A424144

Je voulais le faire en 2 étapes pour le 2 éme cas :
1ere étape récup en FF et 0A et 2éme étape récup entre 00 et 00.

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 22:15
par Tlem
Désolé, mais le cas N°2 est encore trop flou. Donnez nous des exemples concrets avec une dizaine de lignes réelles différentes (en imaginant le pire qui puisse arriver).

Re: [..]Récupérer une chaîne délimitée

Posté : dim. 01 avr. 2018 22:49
par camil
Voila, c'est l'étape 2 qui récupère la mauvaise chaîne.
J'ai recup2 = "424144" alors que je devrai avoir dans recup2 = "544553542031".

#include <String.au3>

$chaine = "FFFF424144FF0054455354203100424144000A424144"

;~ etape 1 : Recuperation de la chaine "005445535420310042414400" dans recup1
$recup1 = StringRegExpReplace($chaine, ".*FF(.+?)0A.*", "\1")

;~ etape 2 :  Recuperation de la chaine "0054455354203100" a partir de recup1 dans recup2
$recup2 = StringRegExpReplace($recup1, ".*00(.+?)00.*", "\1")

;~ etape 3 :  Suppression des valeures "00"  du debut et la fin de recup2
$recup2 = StringRegExpReplace($recup2,"00" , "")

;~ etape 4 :  convertion en ASCII de la chaine dans recup4
$recup3 = _HexToString($recup2)

;~ etape 5 :  Affichage des etapes recup1, recup2 et recup3
MsgBox(0, "Réponse", $recup1 & @CRLF & @CRLF & $recup2 & @CRLF & @CRLF & $recup3)
.

Re: [..]Récupérer une chaîne délimitée

Posté : lun. 02 avr. 2018 00:19
par orax

Code : Tout sélectionner

;~ etape 2 :  Recuperation de la chaine "0054455354203100" a partir de recup1 dans recup2
$recup2 = StringRegExpReplace($recup1, ".*?00(.+?)00.*", "\1")
J'ai ajouté un ?.

Re: [..]Récupérer une chaîne délimitée

Posté : lun. 02 avr. 2018 01:41
par Tlem
Visiblement, vous n'avez pas compris ce que je vous demandais !
Afin d'être efficace et pour éviter que chacun perde son temps en conjectures et suppositions, il nous faudrait connaitre plus d'éléments.
Les solutions qui ont déjà été données fonctionnent pour le cas que vous nous avez montré, mais demain ou après demain vous allez certainement revenir en nous expliquant que cela ne fonctionne pas pour tel autre cas. Du coup il va falloir chercher une autre solution ... Il serait tellement plus simple de nous donner toutes les informations d'un coup !!!

Merci de répondre aux questions ci-dessous :
  • - Sur combien de chaines devez-vous effectuer ces traitements ?
    - D’où viennent ces chaines ?
    - Comment et d'ou récupérez vous ces chaines ? Un fichier ? Si oui donnez nous un extrait.
    - Est-ce que toutes les chaines [FF,0A] ont la même longueur ?
    - Est-ce que le début des chaines [FF,0A] est toujours identique (FFFF424144FF00) ?
    - Dans les chaines [FF,0A], en quoi consiste vos repères FF et OA ? Est-ce toujours le dernier FF avant le premier 0A ?
    - Est-ce que le FF est toujours suivit de 00 et est-ce que 0A est toujours précédé de 00 ?
    - Dans votre dernier exemple, pourquoi devez-vous prendre 544553542031 et laisser la suite 0042414400 ?
    - Si vous remplacez le texte à récupérer par un autre texte, à quoi ressemblerait la chaîne entière ? Pouvez-vous nous montrer plusieurs exemples de chaîne ?
Toutes ces questions ont leur importance car par exemple, voici ce qui peux être fait par rapport à votre message #5 :

Code : Tout sélectionner

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A4241444241440A"
$resul = StringRegExp($chaine, ".*FF(.*)0A.*.*FC(.*)0A.*0A", 1)
MsgBox(0, "En ASCII", _HexToString($resul[0]) & @CRLF & @CRLF & _HexToString($resul[1]))
Ceci évite un tas de traitement inutiles et simplifie le code.
Mais ceci implique des conditions similaires. les points de repères [FF-0A] et [FC-0A*0A] doivent être similaire sur chaque chaîne à traiter. Il ne faut pas que ces caractères ce retrouvent dans les parties à récupérer.
Si toutes vos chaînes sont formatées de la même manière, alors le code ci-dessus fonctionnera dans tous les cas !!!
Si ce n'est pas le cas, merci de nous donner les éléments précédemment demandés.

Sur ce, je m'en vais faire téter les puces dans les bras de Morphée ou peut être téter Morphée sur un tas de puces. ^^

Re: [..]Récupérer une chaîne délimitée

Posté : lun. 02 avr. 2018 02:23
par jchd
J'ajouterais un autre détail important : si c'est une chaîne hexa, il faut faire la recherche et l'extraction sur des frontières d'octets, c'est-à-dire tout les 2 charactères de la chaîne. J'insère des espaces entre chaque octet pour illustrer la difficulté :

FF FF 42 41 44 FF 00 54 45 53 54 20 31 0A 42 41 44 --> 00 54 45 53 54 20 31 OK

FF FF 42 41 4F F3 A2 31 FF 00 54 45 53 54 20 31 B0 A3 0A 42 41 0A 44 --> 3A 23 1F F0 05 44 55 35 42 03 1B tout faux ! La chaîne à capturer est soulignée, mais ce n'est pas ce qui sort.

Encore pire si le nombre de caractères hexa capturés n'est pas pair, si l'une seule des séquences FF ou 0A est à cheval sur deux octets.
Bien évidemment, gérer ce point correctement ne présente pas de difficulté pour une expression régulière, encore fau-il le spécifier dans le patron (un "pattern" est un algorithme, en fait).

Re: [..]Récupérer une chaîne délimitée

Posté : lun. 02 avr. 2018 13:13
par camil
Bonjour a tous,

Merci ORAX ça fonctionne dans les 2 cas. :D
Merci TLEM pour tes explications qui me font avancer sur AUTOIT.
JCHD effectivement je récupère une structure HEXADECIMAL de 256 code ASCII et donc si dans la récupération de se bloc il y a une erreur, la conversion sera faussée. Si tel est le cas je réfléchirai à une vérification à la source.