21. 正規表現¶
21.1 概要¶
JMeter には、パターン マッチング ソフトウェアApache Jakarta OROが含まれています。Jakarta の Web サイトに
は、パターン マッチング文字の概要など、
これに関するドキュメントがいくつかあります。
OROMatcher User's guideに は、製品の古い化身に関するドキュメントもあり、 役立つ可能性があります。
パターン マッチングは、Perl のパターン マッチングと非常によく似ています。Perl のフル インストールには、正規表現に関するドキュメントが多数含まれています。perlrequick、 perlretut、perlre、およびperlrerefを探してください。
Response Assertion テスト要素で使用されているように、 「含む」と「一致する」 の違いを強調する価値があります。
- "を含む"
- 正規表現がターゲットの少なくとも一部に一致したことを意味するため、「alphabet」には「 」が含まれます。' 正規表現が部分文字列 ' phabe ' と一致するためです。
- 「マッチ」
- 正規表現がターゲット全体に一致したことを意味します。したがって、' alphabet ' は' al.*t ' によって "一致" します。
この場合、正規表現を^と$でラップすること、すなわち ' ^al.*t$ 'と同等です。
ただし、常にそうであるとは限りません。たとえば、正規表現 ' alp|.lp.* ' は ' alphabet ' に "含まれています" が、' alphabet ' には "一致"しません。
なんで?パターン マッチャーは、' alphabet ' でシーケンス ' alp ' を検出すると、他の組み合わせの試行を停止するためです。また、' alp ' は、' habet 'を含まないため、 ' alphabet ' と同じではありません。
では、末尾に/がない場合 、修飾子ismxなどをどのように使用しますか? 解決策は、拡張正規表現を使用することです。つまり、/abc/iは(?i)abcになります。以下の修飾子の配置も参照してください。
21.2 例¶
単一の文字列を抽出する
Web ページの次の部分を一致させたいとします:
name="file" value="readme.txt">そして
readme.txt
を抽出したいとします。
適切な正規表現は次の
とおりです。 name="file" value="(.+?)">
上記の特殊文字は次のとおりです。
- (と)
- これらは、返される一致文字列の部分を囲みます
- .
- 任意の文字に一致
- +
- 1回以上
- ?
- 貪欲にならないでください。つまり、最初の一致が成功したときに停止します
注: ?なし 、.+は最初の">を超えて 、最後の可能な">が見つかるまで続きます- これはおそらく意図したものではありません。
注: 上記の式は機能しますが、次の式を使用する方が効率的です:
name="file" value="([^"]+)">
[^"] - "
以外のすべてに一致することを意味
します
。マッチング エンジンは、最初の"が表示されるとすぐに検索を停止できますが、前のケースでは、エンジンは" >と言うのではなく、">が見つかったことを確認する必要があります。
複数の文字列を抽出する
Web ページの次の部分を一致させたいとします:
name="file.name" value="readme.txt"そして、 file.nameとreadme.txt
の両方を抽出したいとします。
適切な正規表現は次の
とおりです。
name="([^"]+)" value="([^"]+)"
これにより、2 つのグループが作成され、JMeter 正規表現エクストラクタ テンプレートで$1$および$2$ .
JMeter Regex Extractor は、グループの値を追加の変数に保存します。
たとえば、次のように仮定します。
- 参照名: MYREF
- 正規表現: name="(.+?)" value="(.+?)"
- テンプレート: $1$$2$
次の変数が設定されます。
- マイレフ
- ファイル名readme.txt
- MYREF_g0
- name="file.name" value="readme.txt"
- MYREF_g1
- ファイル名
- MYREF_g2
- readme.txt
21.3 ラインモード¶
パターン マッチングは、複数行修飾子と単一行修飾子の設定に応じて、わずかに異なるさまざまな方法で動作します。単一行演算子と複数行演算子は互いに何の関係もないことに注意してください。これらは個別に指定できます。
単線モード
単一行モードは、' . ' メタ文字が解釈されます。
デフォルトの動作は ' . ' 改行以外の任意の文字に一致します。単一行モードでは、' . ' は改行とも一致します。
マルチラインモード
複数行モードは、メタ文字 ' ^ ' と ' $ ' の解釈方法にのみ影響します。
デフォルトの動作では、' ^ ' と ' $ ' は文字列の最初と最後でのみ一致します。複数行モードが使用されている場合、' ^ ' メタ文字はすべての行の先頭で一致し、' $ ' メタ文字はすべての行の最後で一致します。
21.4 メタ文字¶
正規表現は、特定の文字をメタ文字として使用します。これらの文字は、RE エンジンにとって特別な意味を持ちます。このような文字は、通常の文字として扱うために\ (バックスラッシュ)を前に付けてエスケープする必要があります。メタ文字とその意味のリストを次に示します (疑問がある場合は、ORO のドキュメントを確認してください)。
- (と)
- グループ化
- [と]
- 文字クラス
- {と}
- 繰り返し
- *、+ 、? _
- 繰り返し
- .
- ワイルドカード文字
- \
- エスケープ文字
- | |
- 代替案
- ^と$
- 文字列または行の開始と終了
ORO では、次の Perl5 拡張正規表現がサポートされています。
- (?#文章)
- テキストが無視される原因となる埋め込みコメント。
- (?:正規表現)
- " () "のようなものをグループ化しますが、グループ マッチは保存されません。
- (?=正規表現)
- ゼロ幅の正の先読みアサーション。たとえば、\w+(?=\s)は、MatchResult に空白を含めずに、空白が続く単語に一致します。
- (?!正規表現)
- ゼロ幅の負の先読みアサーション。たとえば、foo(?!bar)は、「 bar 」が後に続かない「 foo 」の出現に一致します。これはゼロ幅アサーションであることに注意してください。つまり、a(?!b)dはadに一致します。これは、 a の後にbではない文字( d ) が 続き、ゼロ幅アサーションの後にdが続くためです。
- (?imsx)
- 1 つ以上の埋め込みパターン一致修飾子。iは大文字と小文字を区別せず、mは入力の複数行処理を有効にし、sは入力の単一行処理を有効にし、xは拡張空白コメントを有効にします。
21.5 修飾子の配置¶
修飾子は正規表現のどこにでも配置でき、その時点から適用されます。[ORO のバグは、正規表現の最後で使用できないことを意味します。しかし、とにかくそこには何の効果もありません。]
単一行(?s)および複数行(?m)修飾子は通常、正規表現の先頭に配置されます。
大文字と小文字を区別しない修飾子(?i)は、正規表現の一部だけに適用すると便利です。たとえば、次のようになります。
ExAct ケースまたは (?i)ArBiTrARY(?-i) ケースに一致Match ExActケースまたは任意のケース、およびMatch ExAct ケースまたは ARBitrary ケースに一致しますが、完全一致ケースまたは ArBiTrARY ケースには一致しません。
21.6 正規表現のテスト¶
JMeter 2.4 以降、リスナービューの結果ツリー には、サンプラーの応答データで正規表現を直接テストするための RegExp Tester が含まれています。
Java 正規表現をテスト するWeb サイト があります。
もう 1 つの方法は、単純なテスト計画を使用して正規表現をテストすることです。Java Request サンプラーを使用してサンプルを生成したり、HTTP サンプラーを使用してファイルをロードしたりできます。Debug Sampler と Tree View Listener を追加すると、外部サーバーにアクセスする必要なく、正規表現への変更をすばやくテストできます。