21. Reguläre Ausdrücke

21.1 Übersicht

JMeter enthält die Pattern-Matching-Software Apache Jakarta ORO
. Dazu gibt es auf der Jakarta-Website einige Dokumentationen, zum Beispiel eine Zusammenfassung der Pattern-Matching-Zeichen

Es gibt auch eine Dokumentation zu einer älteren Inkarnation des Produkts unter OROMatcher User's guide , die sich als nützlich erweisen könnte.

Der Musterabgleich ist dem Musterabgleich in Perl sehr ähnlich. Eine vollständige Installation von Perl wird jede Menge Dokumentation zu regulären Ausdrücken enthalten – suchen Sie nach perlrequick , perlretut , perlre und perlreref .

Es lohnt sich, den Unterschied zwischen „ enthält “ und „ übereinstimmungen “ hervorzuheben, wie er beim Testelement „Response Assertion“ verwendet wird:

" enthält "
bedeutet, dass der reguläre Ausdruck zumindest teilweise mit dem Ziel übereinstimmt, also enthält ' alphabet ' " " ' ph.b. ', weil der reguläre Ausdruck mit der Teilzeichenfolge ' phabe ' übereinstimmt.
" Übereinstimmungen "
bedeutet, dass der reguläre Ausdruck mit dem gesamten Ziel übereinstimmt. Also wird ' Alphabet ' von ' al.*t ' " gematcht " .

In diesem Fall entspricht dies dem Einschließen des regulären Ausdrucks in ^ und $ , nämlich ' ^al.*t$ '.

Dies ist jedoch nicht immer der Fall. Beispielsweise ist der reguläre Ausdruck ' alp|.lp.* ' in ' alphabet ' " enthalten ", passt aber nicht zu ' alphabet '.

Wieso den? Denn wenn der Musterabgleicher die Sequenz „ alp “ in „ alphabet “ findet, hört er auf, andere Kombinationen zu versuchen – und „ alp “ ist nicht dasselbe wie „ alphabet “, da es „habe“ nicht enthält .

Im Gegensatz zu Perl ist es nicht erforderlich, den regulären Ausdruck in // einzuschließen (dh nicht) .

Wie verwendet man also die Modifikatoren ismx etc., wenn kein abschließendes / vorhanden ist ? Die Lösung besteht darin, erweiterte reguläre Ausdrücke zu verwenden , dh /abc/i wird zu (?i)abc . Siehe auch Platzierung von Modifikatoren weiter unten.

21.2 Beispiele

Einzelne Zeichenfolge extrahieren

Angenommen, Sie möchten den folgenden Teil einer Webseite abgleichen:
name="file" value="readme.txt">
und Sie möchten readme.txt extrahieren .
Ein geeigneter regulärer Ausdruck wäre:
name="file" value="(.+?)">

Die Sonderzeichen oben sind:

( und )
diese schließen den zurückzugebenden Teil des Match-Strings ein
.
jedem Charakter entsprechen
+
ein- oder mehrmals
?
Seien Sie nicht gierig, dh hören Sie auf, wenn das erste Match erfolgreich ist

Hinweis: Ohne das ? , würde das .+ nach dem ersten "> fortfahren , bis es das letzte mögliche "> gefunden hat - was wahrscheinlich nicht beabsichtigt war.

Hinweis: Obwohl der obige Ausdruck funktioniert, ist es effizienter, den folgenden Ausdruck zu verwenden:
name="file" value="([^"]+)"> wobei
[^"] - bedeutet, dass alles übereinstimmt, außer "
In diesem Fall ist die Matching-Engine kann aufhören zu suchen, sobald sie das erste sieht " , wohingegen im vorherigen Fall die Engine prüfen muss, ob sie "> gefunden hat, anstatt " > " zu sagen .

Extrahieren Sie mehrere Zeichenfolgen

Angenommen, Sie möchten den folgenden Teil einer Webseite abgleichen:
name="file.name" value="readme.txt" und Sie möchten sowohl file.name als auch readme.txt extrahieren .
Ein geeigneter regulärer Ausdruck wäre:
name="([^"]+)" value="([^"]+)"
Dies würde 2 Gruppen erstellen, die in der JMeter Regular Expression Extractor-Vorlage als $1$ und verwendet werden könnten $2$ .

Der JMeter Regex Extractor speichert die Werte der Gruppen in zusätzlichen Variablen.

Nehmen wir zum Beispiel an:

  • Referenzname: MYREF
  • Regex: name="(.+?)" value="(.+?)"
  • Vorlage: $1$$2$
Schließen Sie den regulären Ausdruck nicht in / / ein

Folgende Variablen würden gesetzt:

MYREF
datei.namereadme.txt
MYREF_g0
name="datei.name" value="readme.txt"
MYREF_g1
Dateiname
MYREF_g2
readme.txt
Diese Variablen können später im JMeter-Testplan als ${MYREF} , ${MYREF_g1} usw. bezeichnet werden.

21.3 Zeilenmodus

Der Musterabgleich verhält sich je nach Einstellung der Multiline- und Singleline-Modifikatoren auf verschiedene, leicht unterschiedliche Weise. Beachten Sie, dass die einzeiligen und mehrzeiligen Operatoren nichts miteinander zu tun haben; Sie können unabhängig voneinander angegeben werden.

Einzeiliger Modus

Der Single-Line-Modus wirkt sich nur darauf aus, wie die ' . ' Metazeichen wird interpretiert.

Das Standardverhalten ist, dass ' . ' passt auf jedes Zeichen außer Newline. Im einzeiligen Modus wird ' . ' stimmt auch mit Zeilenumbruch überein.

Mehrzeiliger Modus

Der mehrzeilige Modus wirkt sich nur darauf aus, wie die Metazeichen ' ^ ' und ' $ ' interpretiert werden.

Das Standardverhalten ist, dass ' ^ ' und ' $ ' nur ganz am Anfang und am Ende der Zeichenfolge übereinstimmen. Wenn der Mehrzeilenmodus verwendet wird, passt das Metazeichen ' ^ ' am Anfang jeder Zeile und das Metazeichen ' $ ' am Ende jeder Zeile.

21.4 Metazeichen

Reguläre Ausdrücke verwenden bestimmte Zeichen als Metazeichen – diese Zeichen haben für die RE-Engine eine besondere Bedeutung. Solche Zeichen müssen mit vorangestelltem \ (Backslash) maskiert werden, um sie als gewöhnliche Zeichen zu behandeln. Hier ist eine Liste der Metazeichen und deren Bedeutung (im Zweifel bitte die ORO-Dokumentation prüfen).

( und )
Gruppierung
[ und ]
Charakterklassen
{ und }
Wiederholung
* , + und ?
Wiederholung
.
Platzhalterzeichen
\
Escape-Zeichen
|
Alternativen
^ und $
Anfang und Ende des Strings oder der Zeile
Bitte beachten Sie, dass ORO die Metazeichen \Q und \E nicht unterstützt . [In anderen RE-Engines können diese verwendet werden, um einen Teil eines RE zu zitieren, sodass die Metazeichen für sich selbst stehen.] Sie können die Funktion verwenden, um das Äquivalent zu tun, siehe ${__escapeOroRegexpChars(valueToEscape)} .

Die folgenden erweiterten regulären Perl5-Ausdrücke werden von ORO unterstützt.

(?#Text)
Ein eingebetteter Kommentar, der dazu führt, dass Text ignoriert wird.
(?:Regexp)
Gruppiert Dinge wie " () ", bewirkt aber nicht, dass die Gruppenübereinstimmung gespeichert wird.
(?=regulärer Ausdruck)
Eine positive Lookahead-Assertion mit Nullbreite. Beispiel: \w+(?=\s) stimmt mit einem Wort gefolgt von Leerzeichen überein, ohne Leerzeichen in das MatchResult aufzunehmen.
(?!Regexp)
Eine negative Lookahead-Assertion mit der Breite null. Zum Beispiel stimmt foo(?!bar) mit jedem Vorkommen von „ foo “ überein, dem nicht „ bar “ folgt. Denken Sie daran, dass dies eine Assertion mit Nullbreite ist, was bedeutet, dass a(?!b)d mit ad übereinstimmt , weil auf a ein Zeichen folgt, das nicht b ist (das d ) und a d auf die Assertion mit Nullbreite folgt.
(?imsx)
Ein oder mehrere eingebettete Mustervergleichsmodifikatoren. i aktiviert die Groß-/Kleinschreibung, m aktiviert die mehrzeilige Behandlung der Eingabe, s aktiviert die einzeilige Behandlung der Eingabe und x aktiviert erweiterte Whitespace-Kommentare.
Beachten Sie, dass (?<=regexp) - Lookbehind - nicht unterstützt wird.

21.5 Platzierung von Modifikatoren

Modifikatoren können überall in der Regex platziert werden und gelten von diesem Punkt an. [Ein Fehler in ORO bedeutet, dass sie nicht ganz am Ende der Regex verwendet werden können. Allerdings hätten sie dort ohnehin keine Wirkung.]

Die einzeiligen (?s) und mehrzeiligen (?m) Modifikatoren werden normalerweise am Anfang der Regex platziert.

Der Ignore-Case-Modifikator (?i) kann sinnvollerweise nur auf einen Teil einer Regex angewendet werden, zum Beispiel:

Übereinstimmung mit exaktem Fall oder (?i)ArBiTrARY(?-i)-Fall
würde Match ExAct case oder willkürlichen Fall sowie Match ExAct case oder ARBitrary case , aber nicht Match Exact case oder ArBiTrARY case .

21.6 Reguläre Ausdrücke testen ¶

Seit JMeter 2.4 enthält der Listener View Results Tree einen RegExp-Tester, um reguläre Ausdrücke direkt auf Sampler-Antwortdaten zu testen.

Es gibt eine Website zum Testen von regulären Java-Ausdrücken.

Ein anderer Ansatz besteht darin, einen einfachen Testplan zu verwenden, um die regulären Ausdrücke zu testen. Der Java-Request-Sampler kann verwendet werden, um ein Beispiel zu generieren, oder der HTTP-Sampler kann verwendet werden, um eine Datei zu laden. Fügen Sie einen Debug Sampler und einen Tree View Listener hinzu und Änderungen am regulären Ausdruck können schnell getestet werden, ohne auf externe Server zugreifen zu müssen.

Go to top