21. Expressions régulières

21.1 Présentation

JMeter inclut le logiciel de correspondance de modèles Apache Jakarta ORO
Il existe une documentation à ce sujet sur le site Web de Jakarta, par exemple un résumé des caractères de correspondance de modèles

Il existe également une documentation sur une ancienne incarnation du produit dans le guide de l'utilisateur OROMatcher , qui pourrait s'avérer utile.

Le pattern matching est très similaire au pattern matching en Perl. Une installation complète de Perl inclura beaucoup de documentation sur les expressions régulières -- cherchez perlrequick , perlretut , perlre et perlreref .

Il convient de souligner la différence entre " contient " et " correspond ", tel qu'utilisé dans l'élément de test d'assertion de réponse :

" contient "
signifie que l'expression régulière correspond au moins à une partie de la cible, donc ' alphabet ' " contient " ' ph.b. ' car l'expression régulière correspond à la sous-chaîne ' phabe '.
" matchs "
signifie que l'expression régulière correspond à l'ensemble de la cible. Donc ' alphabet ' est " mis en correspondance " par ' al.*t '.

Dans ce cas, cela équivaut à envelopper l'expression régulière dans ^ et $ , c'est-à-dire ' ^al.*t$ '.

Par contre, ce n'est pas toujours le cas. Par exemple, l'expression régulière ' alp|.lp.* ' est " contenue " dans ' alphabet ', mais ne " correspond pas " à ' alphabet '.

Pourquoi? Parce que lorsque le comparateur de motifs trouve la séquence ' alp ' dans ' alphabet ', il arrête d'essayer toute autre combinaison - et ' alp ' n'est pas la même chose que ' alphabet ', car il n'inclut pas ' habet '.

Contrairement à Perl, il n'est pas nécessaire (c'est-à-dire de ne pas) inclure l'expression régulière dans // .

Alors, comment utiliser les modificateurs ismx etc. s'il n'y a pas de / ? La solution consiste à utiliser des expressions régulières étendues , c'est-à-dire que /abc/i devient (?i)abc . Voir aussi Placement des modificateurs ci-dessous.

21.2 Exemples

Extraire une seule chaîne

Supposons que vous souhaitiez faire correspondre la partie suivante d'une page Web :
name="file" value="readme.txt">
et que vous souhaitiez extraire readme.txt .
Une expression régulière appropriée serait :
name="file" value="(.+?)">

Les caractères spéciaux ci-dessus sont :

( et )
ceux-ci contiennent la partie de la chaîne de correspondance à renvoyer
.
correspondre à n'importe quel caractère
+
une ou plusieurs fois
?
ne soyez pas gourmand, c'est-à-dire arrêtez-vous lorsque le premier match réussit

Remarque : sans le ? , le .+ continuerait après le premier "> jusqu'à ce qu'il trouve le dernier possible "> - ce qui n'est probablement pas ce qui était prévu.

Remarque : bien que l'expression ci-dessus fonctionne, il est plus efficace d'utiliser l'expression suivante :
name="file" value="([^"]+)">
[^"] - signifie correspondre à tout sauf "
Dans ce cas, le matching engine peut arrêter de chercher dès qu'il voit le premier " , alors que dans le cas précédent le moteur doit vérifier qu'il a trouvé "> plutôt que de dire " > .

Extraire plusieurs chaînes

Supposons que vous souhaitiez faire correspondre la partie suivante d'une page Web :
name="file.name" value="readme.txt" et que vous souhaitiez extraire à la fois file.name et readme.txt .
Une expression régulière appropriée serait :
name="([^"]+)" value="([^"]+)"
Cela créerait 2 groupes, qui pourraient être utilisés dans le modèle JMeter Regular Expression Extractor comme $1$ et $2$ .

L'extracteur JMeter Regex enregistre les valeurs des groupes dans des variables supplémentaires.

Par exemple, supposons :

  • Nom de référence : MYREF
  • Regex : nom="(.+?)" valeur="(.+?)"
  • Modèle : 1 $ 2 $
Ne placez pas l'expression régulière entre / /

Les variables suivantes seraient définies :

MAREF
fichier.nomreadme.txt
MYREF_g0
nom="fichier.nom" valeur="lisezmoi.txt"
MYREF_g1
nom de fichier
MYREF_g2
lisezmoi.txt
Ces variables peuvent être référencées plus tard dans le plan de test JMeter, comme ${MYREF} , ${MYREF_g1} etc.

21.3 Mode ligne

La correspondance de modèle se comporte de diverses manières légèrement différentes, selon le réglage des modificateurs multilignes et monolignes. Notez que les opérateurs monoligne et multiligne n'ont rien à voir l'un avec l'autre ; ils peuvent être spécifiés indépendamment.

Mode monoligne

Le mode monoligne n'affecte que la façon dont le ' . ' le méta-caractère est interprété.

Le comportement par défaut est que ' . ' correspond à n'importe quel caractère à l'exception de la nouvelle ligne. En mode monoligne, ' . ' correspond également à la nouvelle ligne.

Mode multiligne

Le mode multiligne n'affecte que la façon dont les méta-caractères ' ^ ' et ' $ ' sont interprétés.

Le comportement par défaut est que ' ^ ' et ' $ ' ne correspondent qu'au tout début et à la fin de la chaîne. Lorsque le mode multiligne est utilisé, le métacaractère ' ^ ' correspond au début de chaque ligne et le métacaractère ' $ ' correspond à la fin de chaque ligne.

21.4 Méta-caractères

Les expressions régulières utilisent certains caractères comme méta-caractères - ces caractères ont une signification particulière pour le moteur RE. Ces caractères doivent être échappés en les faisant précéder de \ (barre oblique inverse) afin de les traiter comme des caractères ordinaires. Voici une liste des méta-caractères et leur signification (veuillez consulter la documentation ORO en cas de doute).

( et )
regroupement
[ et ]
classes de personnages
{ et }
répétition
* , + et ?
répétition
.
caractère générique
\
caractère d'échappement
|
alternatives
^ et $
début et fin de chaîne ou de ligne
Veuillez noter qu'ORO ne prend pas en charge les méta-caractères \Q et \E . [Dans d'autres moteurs RE, ceux-ci peuvent être utilisés pour citer une partie d'un RE afin que les méta-caractères se tiennent d'eux-mêmes.] Vous pouvez utiliser function pour faire l'équivalent, voir ${__escapeOroRegexpChars(valueToEscape)} .

Les expressions régulières étendues Perl5 suivantes sont prises en charge par ORO.

(?#texte)
Un commentaire intégré entraînant l'ignorance du texte.
(?:expression régulière)
Regroupe des choses comme " () " mais n'enregistre pas la correspondance de groupe.
(?=expression régulière)
Une assertion d'anticipation positive de largeur nulle. Par exemple, \w+(?=\s) correspond à un mot suivi d'un espace, sans inclure d'espace dans le MatchResult.
(?!expression rationnelle)
Une assertion d'anticipation négative de largeur nulle. Par exemple foo(?!bar) correspond à toute occurrence de " foo " qui n'est pas suivie de " bar ". N'oubliez pas qu'il s'agit d'une assertion de largeur nulle, ce qui signifie que a(?!b)d correspondra à ad car a est suivi d'un caractère qui n'est pas b (le d ) et a d suit l'assertion de largeur nulle.
(?imsx)
Un ou plusieurs modificateurs de correspondance de modèle intégrés. i active l'insensibilité à la casse, m active le traitement multiligne de l'entrée, s active le traitement sur une seule ligne de l'entrée et x active les commentaires d'espace blanc étendus.
Notez que (?<=regexp) - lookbehind - n'est pas pris en charge.

21.5 Placement des modificateurs

Les modificateurs peuvent être placés n'importe où dans la regex et s'appliquer à partir de ce point. [Un bogue dans ORO signifie qu'ils ne peuvent pas être utilisés à la toute fin de la regex. Cependant, ils n'auraient aucun effet là-bas de toute façon.]

Les modificateurs à une seule ligne (?s) et à plusieurs lignes (?m) sont normalement placés au début de la regex.

Le modificateur d'ignorer la casse (?i) peut être utilement appliqué à une partie seulement d'une expression régulière, par exemple :

Respecter la casse ExAct ou la casse (?i)ArBiTrARY(?-i)
correspondrait à la casse exacte ou à la casse arbitraire ainsi qu'à la casse exacte ou à la casse ARBitrary , mais pas à la casse exacte ni à la casse ArBiTrARY .

21.6 Tester les expressions régulières

Depuis JMeter 2.4, l'écouteur View Results Tree inclut un testeur RegExp pour tester les expressions régulières directement sur les données de réponse de l'échantillonneur.

Il existe un site Web pour tester les expressions régulières Java.

Une autre approche consiste à utiliser un plan de test simple pour tester les expressions régulières. L'échantillonneur de requête Java peut être utilisé pour générer un échantillon, ou l'échantillonneur HTTP peut être utilisé pour charger un fichier. Ajoutez un échantillonneur de débogage et un écouteur d'arborescence et les modifications apportées à l'expression régulière peuvent être testées rapidement, sans avoir besoin d'accéder à des serveurs externes.

Go to top