1. 程式人生 > >jmeter---正則表示式

jmeter---正則表示式

概述

JMeter包含模式匹配軟體Apache Jakarta ORO,在Jakarta 網站上有一些文件,例如關於 模式匹配字元的總結,也有關於 OROMatcher使用者指南的文件。
模式匹配非常類似於Perl中的模式匹配。Perl的完整安裝將包括大量關於正則表示式的文件——查詢perlrequick, perlretut, perlre 和 perlreref。
值得強調的是”contains”和”matches”之間的區別,就像在響應斷言中所使用的那樣:
“contains”意味著正則表示式至少匹配目標的某些部分,因此 ‘alphabet’ “contains” ‘ph.b.’ 因為正則表示式與子字串的”phabe”匹配。
“matches”意味著正則表示式與整個目標匹配。因此,”alphabet”是由”al.*t”匹配的。
在這種情況下,它等價於將正則表示式包裝在^和$

中,也就是 ‘^al.*t$’。
然而,情況並非總是如此。例如,正則表示式 ‘alp|.lp.*’裡contains著”alphabet”,但裡沒有matches ‘alphabet’。
為什麼?因為當模式matcher在”alphabet”中找到序列”alp”時,它就會停止嘗試任何其他的組合,而”alp”與”alphabet”不一樣,因為它不包括”habet”。

與Perl不同,不需要將正則表示式封裝在//中。

如果沒有末尾”/”該如何使用修飾符i、s、m、x呢?解決方案是使用擴充套件正則表示式,即/abc/i變形為(?i)abc。參見 修飾詞的放置

例子

正則表示式提取器說明:

面板選項或欄位 含義
Apply to 應用範圍
要檢查的響應欄位 樣本資料來源
引用名稱 其他地方引用時的變數名稱,引用方法:${引用名稱}
正則表示式 資料提取器
模板 對應正則表示式提取器型別,樣式為:1。若為:0,則為所有的匹配資料
匹配數字 正則表示式匹配資料的最終結果可以看做一個數組,匹配數字即可看做是陣列的第幾個元素。當為 0 時,隨機返回匹配的資料,當為 1 時,表示返回匹配結果陣列的第一個元素
預設值 匹配失敗時的預設值。通常用於後續的邏輯判斷,一般通常為特定含義的英文大寫單詞組合,簡單可寫為 ERROR。

提取單個字串

假設想要從web頁面的以下部分進行匹配:
name=”file” value=”readme.txt”>
從中提取”readme.txt”
一個適當的表示式是:
name=”file” value=”(.+?)”>

上面特殊的字元是:
(和):閉合的括號將匹配的部分當成一個整體返回
. :匹配任何字元
+ :匹配一次或者多次(至少一次)
? :非貪婪的,匹配到一個就終止匹配(即匹配0次或者1次)

注意:如果沒有 ? ,.+將會跳過第一個>直到最後一個>,這可能不是我們想要的
注意:儘管上面的表示式取到了我們想要的結果,使用下面的表示式更有效率
name=”file” value=”([^”]+)”>
[^”] 意味著除了不匹配”之外,匹配任何組合
在這種情況下,匹配引擎在匹配到第一個”就停止搜尋
在這種情況下,匹配引擎可以在找到第一個”就停止查詢,而在前面的例子中,引擎必須檢查它找到的是 ”>而不是” >

比如測試百度首頁中的搜尋控制元件的name
這裡寫圖片描述

匹配數字:是指匹配第幾個
預設值:當匹配不到的時候用預設值

抽取多個字串

假設想要從web頁面的以下部分進行匹配:
name=”file.name” value=”readme.txt”
同時提取file.name和readme.txt。
一個合適的正則表示式是:
name=”([^”]+)” value=”([^”]+)”
這將建立兩個組,可以在JMeter正則表示式提取器模板中使用$1$$2$
JMeter Regex提取器在其他變數中儲存組的值。
例如,假設:
引用名:RefName
正則表示式:name=”(.+?)” value=”(. + ?)”
模板:$1$$2$

不將正則表示式包含在/ /

以下的變數將被設定:
RefName:file.namereadme.txt
RefName_g:groups的數量(在此為2)
RefName_g0:name=”file.name” value=”readme.txt”
RefName_g1:file.name
RefName_g2: readme.txt

這些變數可以在JMeter測試計劃中稍後引用,如
${RefName},${RefName_g0}、${RefName_g1}、${RefName_g2}。

還是以百度搜索控制元件為例我們取出id和name結果儲存在引用(也可以叫變數,我習慣稱之為變數)name中(這個名字只要合法就行,下面的例子中要引用這個名字~)

引用名稱:name
正則表示式:<input id=(.*) name=(.*) class=s_ipt value maxlength=255
模版:$1$ $2$

注意:模版中我使用的$1$\ $2\$有個個空格,所以結果為kw wd

regularM
下面分別演示在斷言中引用儲存的變數

使用name_g0:值為<input id=kw name=wd class=s_ipt value maxlength=255,斷言成功

這裡寫圖片描述

使用name_g1:值為kw,斷言成功

這裡寫圖片描述

使用name_g2:值為wd,斷言成功

這裡寫圖片描述

使用name:值為kw wd,所有斷言失敗

這裡寫圖片描述

可以使用debug postprocessor可以檢視(後續會詳細介紹除錯)

這裡寫圖片描述

行模式

模式匹配的行為方式略有不同,這取決於多行和單行修飾符的設定。注意,單行和多行操作符之間沒有任何關係;它們可以獨立地指定。

單行模式

單行模式只會影響元字元”.”的解釋方式。預設情況下”.”匹配任何字元,除了換行符。
在單行的模式中”.”也能匹配換行符。

多行模式

多行模式只會影響元字元^和$被解釋的方式。預設行為是^和$僅在字串的開頭和結尾匹配。當使用多行模式時,元字元^在每一行的開頭都匹配,元字元$在每一行末尾匹配。

元字元

正則表示式使用某些字元作為元字元-這些字元對RE引擎有特殊的意義。這樣的字元若想當做普通的字元來使用必須通過(反斜線)來轉義,元字元的列表和它們的含義(如果有疑問請檢查一下ORO文件)。

符號 含義
( and ) 分組
[ and ] 字元集合意味著匹配一組字元中的一個
{ and } 重複的字元,字元對{}指定所匹配字元的出現次數。de{1,3}f匹配def,deef和deeef;de{3}f匹配deeef;de{3,}f匹配不少於3個e在d和f之間;de{0,3}f匹配不多於3個e在d和f之間
*, + and ? 重複的字元,前兩個是貪婪的,?是非貪婪的
. 單個字元的萬用字元
\ 轉義字元
| 或者
^ and $ 字串或者行的開始和結尾


下面的Perl5擴充套件正則表示式是由ORO支援的

表示式 含義
(?#text) 模式註釋,嵌入的註釋將被忽略
(?:regexp) 不存貯括號內的匹配內容 ,在PERL的模式中,括號內的子模式將存貯在記憶體中,此功能即取消存貯該括號內的匹配內容,如/(?:a|b|c)(d|e)f \1/中的\1表示已匹配的d或e,而不是a或b或c
(?=regexp) 一個零寬度的肯定的預見斷言。其意義為匹配後面為string的模式,例如,\w+(?=\s)匹配一個單詞後面跟著空格,但匹配結果中不包含空格。再比如:string = “25abc8”; string =~ /abc(?=[0-9])/; matched = $&; # $&為已匹配的模式,此處為abc,而不是abc8
(?!regexp) 一個0寬度的否定的預見匹配,意義為匹配後面非string的模式,例如 foo(?!bar) 匹配任何foo*但是不能匹配後面跟bar的字串。記住這個一個0寬度的斷言a(?!b)d將匹配ad,因為a後面跟隨的是字元d(不是b)並且a d遵循零寬度斷言。
(?imsx) 通常模式選項置於其後,有四個選項:i、m、s、x可以內嵌使用,語法為:/(?option)pattern/,等價於/pattern/option

修飾符位置

修飾符可以放在regex的任何地方,並從該點開始應用。【在ORO的一個bug指出不能在正則表示式的末尾使用它們。無論如何,他們都沒有效果】。
單行(?s)和多行(?m)修飾符通常放在正則表示式的開頭。
忽略大小寫的修飾符(?i)可以有效地應用於正則表示式的一部分,例如:

Match ExAct case or (?i)ArBiTrARY(?-i) case

將會匹配 Match ExAct case or arbitrary ,也會匹配 Match ExAct case or ARBitrary ,但不會匹配 Match exact case or ArBiTrARY 。

測試正則表示式

自JMeter 2.4以來,”View Results Tree”包括一個RegExp測試器,用於在取樣響應資料上直接測試正則表示式。
有一個網站可以測試Java正則表示式。
另一種方法是使用一個簡單的測試計劃來測試正則表示式。可以使用Java請求取樣器生成一個示例,或者使用HTTP取樣器來載入一個檔案。新增一個除錯取樣器和一個樹檢視偵聽器,並且對正則表示式的更改可以快速地進行測試,而不需要訪問任何外部伺服器。
regular
在觀察結果樹種編輯正則表示式,勾選regular exp ,點選搜尋,在觀察結果樹中若有匹配則將結果樹中的label自動用紅顏色的框框起來(每個請求的小框~大框我畫的)。