一、 Jmeter中怎麼書寫正則表達式以及正則表達式的使用方式
正則表達式一般用於獲取某個變量值
Apply to:正則表達式應用範圍,一般默認爲Main sample only、主體
引用名稱:自己定義的變量名稱,後續請求將要引用到的變量名,如填寫的是:token,後面的引用方式是${token}
正則表達式:提取內容的正則表達式
() ---- 括起來的部分就是需要提取內容
. ---- 點號表示匹配除換行符 \n 之外的任何字符串
+ ---- 匹配一次或多次
? ---- 在找到第一個匹配項後停止
模板:用$$引用起來,匹配正則表達式中有()的值,就匹配如果在正則表達式中有多個正則表達式,則可以是$1$$2$
$0$:表示取所有值,取正則表達式中所有的值,也就是非括號與括號中所有的值
$1$:表示取第一個()中的值
$2$:表示只取第二個()中的值
$n$:表示取第n個()中的值
$1$,$2$:表示取第一個()與第二個()中的值,注意:第一個括號中的值與第二個括號中的值連接方式就依賴於它們之間是用什麼分隔符,如$1$,$2$,它們之間是用逗號來分隔的,那麼取到的第一個值與第二個值連接方式就是逗號分隔,這個下面舉例會說明的
匹配數字:根據正則表達式所能匹配到的值
0 ---- 代表隨機取一個值
-1 ---- 代表取出所有值,但是這種情況下引用變量時,就必須要指名引用哪個變量值,如引用名稱是token,那麼後續引用此變量時,就需要用${token_1}或${token_n}來匹配對應的值
1 ---- 代表取第一個值
2 ---- 代表取第二個值
n ---- 代表取n個值
缺省值:如果正則表達式沒有搜找到值,則使用此缺省值
二、正則表達式驗證工具
RegexTester工具可以用來驗證所寫的正則表達式是否有誤
1、下載地址:https://sourceforge.net/projects/regextester/
2、下載後解壓,不需要安裝,直接點擊應用程序
3、然後打開頁面,如下圖頁面
(1)RegEx Expression:輸入正則表達式
(2)Test Text:需要提取的返回數據
(3)按Test[F5]鍵,生成對應的值,驗證生成的值是否是自己所需要的值
三、正則表達式的使用方式:
1、正則表達式的匹配值只取一個值,也就是正則表達式中只有一個(),所以模板輸入爲$1$,匹配數字也輸入爲1
(1)下圖中是http1請求返回的值,如果http2請求需要用到token值,那麼用正則表達式來提取
(2)線程組---添加 ---後置處理理---正則表達式提取器,輸入引用名稱、正則表達式、模板、匹配數字以及缺省值
(3)、http2請求中需要token值
2、正則表達式有兩個(),模板輸入爲$1$,匹配數字輸入爲1
(1)提取下圖中的https的鏈接地址
(2)正則表達式書寫如下圖,一定要注意<>中字符串的書寫規範必須跟上圖中的<>字符串的書寫規範一致,該空格的地方要空格,否則會匹配不到數據;
- 當然正則表達式也可以寫成:<a href="https://(.+?)" target="_blank" class="overshopadv".+ 但是爲了在http2請求中引用變量值時,將服務器名稱與路徑分別引用變量值,所以建議如果獲取的鏈接地址帶路徑名,最好用兩個()來分別獲取數據,如果獲取的鏈接地址不帶路徑名,那就不需要用兩個()了;
- 正則表達式還可以寫成:<a href="https://(.+?)(.+?)" target="_blank" class="overshopadv".+ 那麼模板在輸入時就不需要輸入$1$/$2$了,只要輸入$1$$2$;
(3)運行後,在察看結果樹中可以看到所取到的數據,只取到了第一個括號中的值
(4)雖然http2請求沒有標紅,但是顯示請求的鏈接地址不是我們所需要的鏈接地址
3、正則表達式有兩個(),模板輸入爲$1$/$2$,匹配數字輸入爲1
(1)模板一定要輸入$1$/$2$,否則獲取到的字符串就無法以/連接了
(2)下圖中可以看到調試取樣器中所取到的數據正是我們所需要的數據
(3)爲什麼此時http2請求標紅呢,下圖中可以看到雖然獲取的數據正是我們所需要的鏈接地址,但是這個鏈接地址引用到http2請求中,在請求時自動加上了一個/號,而我們所需要的鏈接地址不需要加上這個/號。查看http2請求中所引用的變量(上上圖),發現在服務器名稱上引用了變量,而獲取的鏈接地址cuxiao.suning.com/hwgzpbz.html是服務器名+路徑名組成的,顯示將路(/hwgzpbz.html)寫在服務器名稱上是不對的;
(4)在察看結果樹---調試取樣器中可以看到獲取的數據有一個ABCDEF_g1、ABCDEF_g2的值,分別是服務器名與路徑名;
ABCDEF=cuxiao.suning.com/hwgzpbz.html ------ ${ABCDEF}引用的是這個裏面的數據
ABCDEF_g=2 ----- 表示正則表達式中需獲取2個值,正則表達式中有幾個(),這邊就顯示幾個數字
ABCDEF_g0=<a href="https://cuxiao.suning.com/hwgzpbz.html" target="_blank" class="overshopadv" ---- 獲取正則表達式中所有的數據
ABCDEF_g1=cuxiao.suning.com ---- 獲取正則表達式中第一個()中的值
ABCDEF_g2=hwgzpbz.html ---- 獲取正則表達式中第二個()中的值
(5)所以我們在http2請求中,分別引用ABCDEF_g1、ABCDEF_g2變量的值
(6)運行後在察看結果樹中看到http2請求成功了,請求中的鏈接地址正是我們所需要的鏈接地址
4、正則表達式有兩個(),模板輸入爲$0$,匹配數字輸入爲1,解釋一下當模板輸入爲$0$時,獲取是什麼數據,很顯然模板輸入爲$0$時,獲取的是正則表達式中所有的數據<a href="https://cuxiao.suning.com/hwgzpbz.html" target="_blank" class="overshopadv",包括括號與非括號中的數據
5、正則表達式有兩個(),模板輸入爲$3$,匹配數字輸入爲1,將獲取不到數據,這個時候取的是缺省值中輸入的數據
6、正則表達式有兩個(),模板輸入爲$1$/$2$,匹配數字輸入爲-1,獲取的是所有能滿足正則表達式的數據,那麼在引用變量時,首先需要調試程序,然後查找所需要的數據,最後引用變量時,格式是${變量名_n},這種方式一般用在變量名相同但有n種不同的值,而我們只需要其中某一個值
(1)匹配數字輸入爲-1
(2)調試取樣器中可以查看到,獲取的是所有能滿足正則表達式的數據,而我們所需要的數據是ABCDEF_4的數據
(3)http2請求中服務器名稱分別輸入${ABCDEF_4_g1}和${ABCDEF_4_g2}
7、正則表達式有兩個(),模板輸入爲$1$/$2$,匹配數字輸入爲0,當匹配數字輸入爲0時,獲取的是滿足正則表達中某一個隨機數據,這種方法不適合於變量名相同但有n種值的情況,否則所獲取的就不是自己所需要的數據,而且每次運行時,所獲取的數據都不一樣
8、當獲取的數據,變量名對應唯一的值,那麼匹配數字無論是輸入0還是1都可以,但不要輸入-1,因爲一旦輸入了-1,就算此時一個變量名對應唯一一個值,但是獲取的數據格式還是變爲變量名_n的形式,那麼引用變量時,同樣也需要用${變量名_ n}的格式
總結:1、模板對應正則表達式,正則表達式中有幾個(),一般情況下就需要寫幾個$$,注意$$與$$之間的連接符號;
2、匹配數字對應滿足正則表達式所獲取的數據,當變量名對應唯一值,輸入0或1都可以,當變量名對應n值,那麼就需要用-1,此時引用變量時,格式就變爲${變量名_n}