capture d'une chaîne de caractères sur plusieurs lignes

HP Loadrunner
BlueExp
Messages : 30
Inscription : jeu. 24 nov. 2011 10:44

capture d'une chaîne de caractères sur plusieurs lignes

Message : #987 BlueExp
ven. 27 févr. 2015 17:31

Bonjour,

Je souhaite capturer une chaîne de caractères sur plusieurs ligne, chacune se terminant par "\n".
Avec les fonctions "web_reg_save_param" et "web_reg_save_param_ex", la fonction ne capture que jusqu'au "\n" de la première ligne.
Je n'obtiens pas de meilleurs résultat avec les expressions régulières : "web_reg_save_param_regexp"

Je cherche à capturer ce qu'il y a entre <sso> et </sso>.

Voici ce que retourne le serveur et qui comprend la chaîne à capturer :

<sso>dwqmoKF3PoK7xN2mqSjoQSacjjaNETFjnuSyLLWnNI1yxwPGazJLRWpoN
vLudZRBR\n
tZaMCPdBbKxAMeYDYbw/9wKF8ipkccJ2UU0qsPRwYNVOX5x9gc/HyprlgA7LUYahK\n
eVQwbJ9KVc2mVP6dr63obod2MUq49wBtXSDvFP7+gZupXs7K/HP77d3u3CKeTJioQ\n
bVv7995Dh28EhBKPoHGnOzxQ8+QnUexURaK3QjTPinit0mxZsPKhTnrurhe6EjSPR\n
0pPyE3AOz7iScTrXhAXItrCDf6L1mqAUTRk3l</sso>

Avez-vous une idée sur la manière de résoudre le problème ?
Merci par avance pour vos réponses.
BE

Khap
Messages : 41
Inscription : jeu. 28 juin 2012 17:38

Re: capture d'une chaîne de caractères sur plusieurs lignes

Message : #988 Khap
ven. 27 févr. 2015 17:40

Dans la plupart des implémentations des expressions régulières, les caractères invisibles de retour à la ligne CR et LF ne sont pas matchés par le métacaractère "."
Il faut que tu définisses une classe de caractères (énumération des possibilités) qui comprenne tes retours à la ligne, mais je ne suis pas persuadé que ça fonctionne.

Un premier jet de solution serait :

Code : Tout sélectionner

<sso>([.\r\n]*?)</sso>

BlueExp
Messages : 30
Inscription : jeu. 24 nov. 2011 10:44

Re: capture d'une chaîne de caractères sur plusieurs lignes

Message : #989 BlueExp
ven. 27 févr. 2015 18:12

Merci !

Effectivement, ça peut fonctionner avec les classes de caractères.
Le problème est résolu en cherchant les chaînes de caractères par morceaux avec un "Ordinal=All". Il suffit ensuite de concaténer les résultats :

web_reg_save_param_regexp (
"ParamName=SSOTOKEN1",
"RegExp=([0-9a-zA-Z+/]+)\n",
"Ordinal=All",
LAST );


web_reg_save_param_regexp (
"ParamName=SSOTOKEN2",
"RegExp=([0-9a-zA-Z+/]+)<",
"Ordinal=All",
LAST );

Khap
Messages : 41
Inscription : jeu. 28 juin 2012 17:38

Re: capture d'une chaîne de caractères sur plusieurs lignes

Message : #990 Khap
ven. 27 févr. 2015 18:13

J'ignore pourquoi VUGen ne parvient pas à construire une classe qui fonctionne avec "." et \r\n ensemble.

Tu peux donc partir là dessus (testé chez moi) :

Code : Tout sélectionner

<sso>((?:.|[\r\n])*?)</sso>
Explications :
1. Comme tu le sais, les parenthèses permettent d'indiquer l'étendue de la capture. Pour info, VUGen n'est capable de gérer qu'une seule capture par regexp ;
2. Les parenthèses peuvent aussi servir à introduire des opérateurs logiques. Ici, on utilise le OU = "|" ;
3. Le modificateur "?:" en début de parenthèse permet d'indiquer que le jeu de parenthèse n'est pas à capturer, ce qui permet à l'expression d'être prise en charge par VUGen (il n'est pas impossible que ça fonctionne sans mais je soupçonne que VUGen s'arrête au premier jeu de parenthèse actif). Le jeu de parenthèse ainsi désactivé est néanmoins actif au niveau des opérations logiques qui y sont appliquées, comme le OU, ou encore le multiplicateur ("*").
4. "*?" (forme lazy) est utilisé plutôt que "*" (forme greedy) pour capturer la plus petite chaîne possible. Si tu utilisais la forme greedy, un jeu de données du type "<sso>1</sso><sso>2</sso>" serait capturé en "1</sso><sso>2". La forme lazy capture bien "1".


Revenir vers « HP Loadrunner »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités