目錄
- 實(shí)例1:從JDBC查詢數(shù)據(jù),并提取查詢結(jié)果
- 實(shí)例3(簡(jiǎn)單):提取單個(gè)字符串
- 實(shí)例4(簡(jiǎn)單):提取多個(gè)字符串
- 實(shí)例5(簡(jiǎn)單):找到所有小數(shù)的數(shù)字,比如10.2
- 實(shí)例6(簡(jiǎn)單):找到所有小數(shù)點(diǎn)后的數(shù)字
- 實(shí)例7(簡(jiǎn)單):找到第一個(gè)有小數(shù)的數(shù)字
- 實(shí)例8(簡(jiǎn)單):找到所有小數(shù)的數(shù)字
- 正則表達(dá)式語(yǔ)法
過(guò)年前產(chǎn)假歸來(lái),jmeter很多知識(shí)生疏了,這兩天打開(kāi)jmeter摸索了幾下,老了記不住,還是準(zhǔn)備弄個(gè)jmeter系列隨筆吧。
言歸正傳,使用jmeter時(shí)經(jīng)常有這樣的情況:一個(gè)完整的操作流程,需先完成某個(gè)操作,獲得某個(gè)值或數(shù)據(jù)信息,然后才能進(jìn)行下一步的操作(也就是常說(shuō)的關(guān)聯(lián)/將上一個(gè)請(qǐng)求的響應(yīng)結(jié)果作為下一個(gè)請(qǐng)求的參數(shù)); 在jmeter中,利用正則表達(dá)式提取器來(lái)輕松幫助我們完成這一動(dòng)作。正則表達(dá)式就是用于描述這些規(guī)則的工具。換句話說(shuō),正則表達(dá)式就是記錄文本規(guī)則的代碼。學(xué)習(xí)正則表達(dá)式最好就是從實(shí)例下手。下面讓我們進(jìn)入實(shí)例。
實(shí)例1:從JDBC查詢數(shù)據(jù),并提取查詢結(jié)果
1、新建線程組并把相關(guān)jar放到/lib或/lib/ext目錄、添加JDBC Connection Configuration等,此處省略,直接附上截圖



2、添加JDBC Request,Query Type=Select Statement,Varibale name=MySQL。建議在數(shù)據(jù)庫(kù)工具執(zhí)行一次后,在后面察看結(jié)果樹(shù)時(shí)做對(duì)比,檢查是否提取正確。

3、在JDBC Request下創(chuàng)建正則表達(dá)式提取器,在JDBC Request元件下右擊【添加】-【后置處理器】-【正則表達(dá)式提取器】即可。本例子查詢兩列,所以需創(chuàng)建兩個(gè)正則表達(dá)式提取器

4、配置提取第一列字段,
Apply to通常是Main sample only,
要檢查的響應(yīng)字段視情況選擇,在此例選【主體】,
引用名稱填id,即下一個(gè)請(qǐng)求要引用的參數(shù)名稱,使用格式${id},注意引用名稱命名不要跟線程組內(nèi)其他變量名稱重復(fù)
正則表達(dá)式,則是本文章重點(diǎn),這里填([a-zA-Z0-9-]{1,}) ,
():括起來(lái)的部分就是要提取的。
.:匹配任何字符串。
+:一次或多次。
?:不要太貪婪,在找到第一個(gè)匹配項(xiàng)后停止。
模板,選擇第一個(gè)匹配的字段,填$1$,用$$引用起來(lái),如果在正則表達(dá)式中有多個(gè)正則表達(dá)式,則可以是$2$$3$等等,表示解析到的第幾個(gè)值給id。如:$1$表示解析到的第1個(gè)值
匹配數(shù)字,0代表隨機(jī)取值,-1表示全部,0隨機(jī),1第一個(gè),2第二個(gè),
缺省值如果參數(shù)沒(méi)有取得到值,那默認(rèn)給一個(gè)值讓它取。可填可不填,看具體使用場(chǎng)景。

5、配置提取第二列字段
Apply to填Main sample only,
要檢查的響應(yīng)字段選【主體】,
引用名稱填phone,后面請(qǐng)求使用變量時(shí)格式${phone},
正則表達(dá)式,填(\d{10,}) ,
模板,選擇第一個(gè)匹配的字段,填$1$,
匹配數(shù)字,除了0,建議填1,
缺省值不填

6、檢查提取器提取結(jié)果,有兩種方法校驗(yàn)結(jié)果。第一種。另外一個(gè),就是不使用請(qǐng)求,。
方法1:添加Debug PostProcessor也可打印所有變量的值,添加即可,然后運(yùn)行結(jié)果

,在察看結(jié)果樹(shù)可以看到提取變量的值是否正確


方法2:引用到下一個(gè)請(qǐng)求

實(shí)例2:從登錄響應(yīng)請(qǐng)求頭提取JSESSIONID
1、繼續(xù)在實(shí)例1的基礎(chǔ)上,描述實(shí)例2。添加HTTP請(qǐng)求,用于登錄

運(yùn)行一次,在察看結(jié)果樹(shù)看到取樣器結(jié)果有Set-Cookie: JSESSIONID。

2、在登錄HTTP請(qǐng)求元件下右擊【添加】-【后置處理器】-【正則表達(dá)式提取器】即可。正則表達(dá)式填寫(xiě):(?=Set-Cookie: JSESSIONID=)\w+\b

3、在線程組內(nèi)部站點(diǎn)下創(chuàng)建HTTP Cookie管理器,并引用正則表達(dá)式提取的引用變量JSESSIONIDw。格式為${JSESSIONIDw}

4、運(yùn)行一次,在察看結(jié)果樹(shù)其他需要登錄才能請(qǐng)求的請(qǐng)求檢查

實(shí)例3(簡(jiǎn)單):提取單個(gè)字符串
例匹配Web頁(yè)面的如下部分:name = "file" value = "readme.txt">并提取readme.txt。一個(gè)合適的正則表達(dá)式:name = "file" value = "(.+?)">。
():封裝了待返回的匹配字符串。
.:匹配任何單個(gè)字符串。
+:一次或多次。
?:不要太貪婪,在找到第一個(gè)匹配項(xiàng)后停止。
實(shí)例4(簡(jiǎn)單):提取多個(gè)字符串
例匹配Web頁(yè)面的如下部分:name = "file.name" value = "readme.txt">并提取file.name和readme.txt。一個(gè)合適的正則表達(dá)式:name = "(.+?)" value = "(.+?)"。這樣就會(huì)創(chuàng)建2個(gè)組,分別用于$1$和$2$
比如:
引用名稱:MYREF
模板:$1$$2$
如下變量的值將會(huì)被設(shè)定:
MYREF: file.namereadme.txt
MYREF_g0: name = "file.name"value = "readme.txt"
MYREF_g1: file.name
MYREF_g2: readme.txt
在需要引用地方可以通過(guò):${MYREF}, ${MYREF_g1}進(jìn)行使用
實(shí)例5(簡(jiǎn)單):找到所有小數(shù)的數(shù)字,比如10.2
引用名稱:aa
正則表達(dá)式:([0-9]+\.[0-9]+)
模板:$0$區(qū)配數(shù)字:-1調(diào)用:
${aa_1}:取出第一個(gè)滿足要求的數(shù)字
${aa_2}:取出第二個(gè)滿足要求的數(shù)字
實(shí)例6(簡(jiǎn)單):找到所有小數(shù)點(diǎn)后的數(shù)字
引用名稱:aa
正則表達(dá)式:([0-9]+)\.([0-9]+),必須用括號(hào)分組
模板:$2$(第二組)
區(qū)配數(shù)字:-1取出所有符合要求的調(diào)用:
${aa_1}:取出第一個(gè)滿足要求的數(shù)字
${aa_2}:取出第二個(gè)滿足要求的數(shù)字
實(shí)例7(簡(jiǎn)單):找到第一個(gè)有小數(shù)的數(shù)字
引用名稱:aa
正則表達(dá)式:([0-9]+)\.([0-9]+),必須用括號(hào)分組
模板:不寫(xiě)可以,也可以$2$$1$
區(qū)配數(shù)字:1(第一個(gè))調(diào)用:
${aa_g1}:取出滿足要求的第一組數(shù)字
${aa_g2}:取出滿足要求的第二組數(shù)字
實(shí)例8(簡(jiǎn)單):找到所有小數(shù)的數(shù)字
引用名稱:aa
正則表達(dá)式:([0-9]+)\.([0-9]+),必須用括號(hào)分組
模板:不寫(xiě)可以,也可以$2$$1$
區(qū)配數(shù)字:-1取出所有符合要求的調(diào)用:
${aa_1_g1}:取出第一個(gè)滿足要求的第一組數(shù)字
${aa_1_g2}:取出第一個(gè)滿足要求的第二組數(shù)字
${aa_2_g1}:取出第一個(gè)滿足要求的第一組數(shù)字
${aa_2_g2}:取出第一個(gè)滿足要求的第二組數(shù)字
如何檢查正則表達(dá)式
工具使用Regester檢查編寫(xiě)的正則表達(dá)式是否正確。可訪問(wèn)deerchao.net下載

jmeter正則表達(dá)式提取器參數(shù)說(shuō)明
后置處理器:在請(qǐng)求結(jié)束或者返回響應(yīng)結(jié)果時(shí)發(fā)揮作用。
正則表達(dá)式提取器:允許用戶從服務(wù)器的響應(yīng)中通過(guò)使用perl的正則表達(dá)式提取值。該元素會(huì)作用在指定范圍取樣器,用正則表達(dá)式提取所需值,生成模板字符串,并將結(jié)果存儲(chǔ)到給定的變量名中。
APPly to:作用范圍(返回內(nèi)容的斷言范圍)
Main sample and sub-samples:作用于父節(jié)點(diǎn)的取樣器及對(duì)應(yīng)子節(jié)點(diǎn)的取樣器
Main sample only:僅作用于父節(jié)點(diǎn)的取樣器
Sub-samples only:僅作用于子節(jié)點(diǎn)的取樣器
JMeter Variable:作用于jmeter變量(輸入框內(nèi)可輸入jmeter的變量名稱)
要檢查的響應(yīng)字段ResponseFieldtocheck:需檢查的響應(yīng)報(bào)文的范圍
Body:主體,響應(yīng)報(bào)文的主體,一個(gè)網(wǎng)頁(yè)頁(yè)面的內(nèi)容,除了信息頭以外的內(nèi)容
Body(unescaped):主體,響應(yīng)的主體內(nèi)容且替換了所有的html轉(zhuǎn)義符,注意html轉(zhuǎn)義符處理時(shí)不考慮上下文,因此可能有不正確的轉(zhuǎn)換,不太建議使用
BodyasaDocument:從不同類型的文件中提取文本,注意這個(gè)選項(xiàng)比較影響性能
Response Headers:響應(yīng)信息頭
Request Headers:請(qǐng)求信息頭
URL:統(tǒng)一資源定位符,即Internet上用來(lái)描述信息資源的字符串
Response Code:響應(yīng)狀態(tài)碼,比如200、404等
Response Message:響應(yīng)信息
引用名稱(ReferenceName):Jmeter變量的名稱,存儲(chǔ)提取的結(jié)果;即下個(gè)請(qǐng)求需要引用的值、字段、變量名。每個(gè)存儲(chǔ)組需要使用共結(jié)果時(shí),應(yīng)使用:[refname]_g#,其中[refname]是你輸入的名字,#是組號(hào),0是整個(gè)匹配結(jié)果,而1是指第一組匹配值
引用方法:${引用名稱}
正則表達(dá)式(RegularExpression):使用正則表達(dá)式解析響應(yīng)結(jié)果,“()”表示提取字符串中的部分值,請(qǐng)不要使用“||”,除非你需要匹配這字符。
下面是常用的正則表達(dá)式操作符:

模板(Template):從匹配的結(jié)果中創(chuàng)建一個(gè)字符串,這是通過(guò)正則表達(dá)式匹配出來(lái)的一組值,意為使用提取到的第幾個(gè)值(可能有多個(gè)值匹配,因此使用模板);從1開(kāi)始匹配,以此類推。
通過(guò)正則表達(dá)式匹配出來(lái)的一組值,語(yǔ)法為:$1$指代第一組,$2$指代第二組,$0$指代整個(gè)匹配結(jié)果
參數(shù)可以在取值模板組合使用,例如:“11-22”作為模板得到的值是使用“-”連接的第一個(gè)待匹配內(nèi)容與第二個(gè)待匹配內(nèi)容組合而成的字符串。
匹配數(shù)字(MatchNo):正則表達(dá)式匹配數(shù)據(jù)的結(jié)果可以看做一個(gè)數(shù)組,表示如何取值:0代表隨機(jī)取值,正數(shù)n則表示取第n個(gè)值(比如1代表取第一個(gè)值),負(fù)數(shù)則表示提取所有符合條件的值。一般與ForEach控制器配合使用。
缺省值(DefaultValue):匹配不到數(shù)據(jù)時(shí),引用變量返回一個(gè)默認(rèn)值,在調(diào)試中此功能很有用,如果沒(méi)有設(shè)置默認(rèn)值,那么很難分辨出正則表達(dá)式是否有匹配到數(shù)據(jù)或使用是否正確,當(dāng)然也可據(jù)測(cè)試需求,在調(diào)試完成后去掉默認(rèn)值的設(shè)置。通常用于后續(xù)的邏輯判斷,一般通常為特定含義的英文大寫(xiě)組合,比如:ERROR
正則表達(dá)式語(yǔ)法
1\bhi\b : 匹配只有hi的字符,\b代表的位置,第一個(gè)\b代表單詞開(kāi)始的位置,第二個(gè)\b代表單詞結(jié)束的位置2\bhi\b.*\bthis\b : 匹配hi的字符后,中間有任意個(gè)字符后,后面是this的字符3 . : 表示任意字符的元字符,例如Perl正則表達(dá)式,r.t匹配這些字符串:rat、rut、rt,但是不匹配root4 *:表示任意數(shù)量的元字符,代表的不是字符,也不是位置,而是數(shù)量。匹配0或多個(gè)正好在它之前的那個(gè)字符。例如Perl正則表達(dá)式.*意味著能夠匹配任意數(shù)量的任何字符5 \d : 表示任意一個(gè)數(shù)字[0-9]6\d+: 匹配一個(gè)或更多連續(xù)的數(shù)字。這里的+是和*類似的元字符,不同的是*匹配重復(fù)任意次(可能是0次),而+則匹配重復(fù)1次或更多次。7\D: 匹配任意非數(shù)字的字符[^0-9] \w:8 \d{2}: 表示任意一個(gè)數(shù)字出現(xiàn)兩次,相當(dāng)于\d\d9 \s : 匹配任意的空白符,包括空格,換行符,制表符(tab),中文全角空格。即空白 [ \r\t\n\f]10\S: 匹配任意不是空白符的字符。即非空白 [^ \r\t\n\f]11\w : 匹配字母,數(shù)字,下劃線或漢字。即任意單詞字符 [_0-9a-zA-Z]12\W: 匹配任意不是字母,數(shù)字,下劃線,漢字的字符。即任意非單詞字符 [^_0-9a-zA-Z]13\b\w{2}\b : 匹配剛好有兩個(gè)字符的單詞14\b : 匹配單詞的開(kāi)始和結(jié)束15^ : 匹配字符串的開(kāi)始。例如Perl正則表達(dá)式^Whenin能夠匹配字符串"Wheninthecourseofhumanevents"的開(kāi)始,但是不能匹配"WhatandWheninthe"16$ : 匹配字符串的結(jié)束, 例: ^\d{2,5}$ 表示輸入的數(shù)字必須是2位(包含)到5位(包含)之間;
例如Perl正則表達(dá)式weasel$能夠匹配字符串"He'saweasel"的末尾,但是不能匹配字符串"Theyareabunchofweasels."
17\ : 轉(zhuǎn)義字符,如果要查找元字符就需要用轉(zhuǎn)義字符來(lái)完成,比如: deerchao\.net 實(shí)際上是deerchao.net。
用來(lái)將這里列出的這些元字符當(dāng)作普通的字符來(lái)進(jìn)行匹配。例如Perl正則表達(dá)式\$被用來(lái)匹配美元符號(hào),而不是行尾,類似的,Perl正則表達(dá)式\.用來(lái)匹配點(diǎn)字符,而不是任何字符的通配符
18 重復(fù)次數(shù)說(shuō)明: *是重復(fù)0次或多次,+是重復(fù)1次或多次,?是重復(fù)零次或一次,{n} 是重復(fù)n次,{n,}是重復(fù)n次到多次,{n,m}是重復(fù)n次到m次19[]、[c1-c2]、[^c1-c2]: 括號(hào)里的字符會(huì)被匹配,比如[ab]匹配a或b字符,[,?]匹配逗號(hào)或問(wèn)號(hào)
例如Perl正則表達(dá)式r[aou]t匹配rat、rot和rut,但是不匹配ret。
可以在括號(hào)中使用連字符-來(lái)指定字符的區(qū)間,例如Perl正則表達(dá)式[0-9]可以匹配任何數(shù)字字符;
還可以制定多個(gè)區(qū)間,例如Perl正則表達(dá)式[A-Za-z]可以匹配任何大小寫(xiě)字母。
另一個(gè)重要的用法是“排除”,要想匹配除了指定區(qū)間之外的字符——也就是所謂的補(bǔ)集——在左邊的括號(hào)和第一個(gè)字符之間使用^字符,例如Perl正則表達(dá)式[^269A-Z]將匹配除了2、6、9和所有大寫(xiě)字母之外的任何字符
20 [a-z0-9A-Z] : 相當(dāng)于匹配\w
21 | : 匹配或規(guī)則,將兩個(gè)匹配條件進(jìn)行邏輯“或”(Or)運(yùn)算。比如: \(0\d{2}\)[- ]?\d{8}|\(0\d{3}\)[- ]\d{7}|0\d{2}[- ]?\d{8}|0\d{3}[- ]?\d{7} 這個(gè)就是匹配電話號(hào)碼的,如:012-56236562, 0536-1234567,(0536)-1234567,01212345678
例如Perl正則表達(dá)式(him|her)匹配"itbelongstohim"和"itbelongstoher",但是不能匹配"itbelongstothem."。注意:這個(gè)元字符不是所有的軟件都支持的
22 ():匹配分組,255.134.123.123 或 193.168.1.1 匹配表達(dá)式為:(([01]?\d\d?|25[0-5]|2[0-4]\d)\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)
23 \B : 匹配不是單詞開(kāi)頭或結(jié)尾的位置
24 + :匹配1或多個(gè)正好在它之前的那個(gè)字符。例如Perl正則表達(dá)式9+匹配9、99、999、98、93dsf、9.....等。注意:這個(gè)元字符不是所有的軟件都支持的
25 ? :匹配0或1個(gè)正好在它之前的那個(gè)字符。注意:這個(gè)元字符不是所有的軟件都支持的
26 [^x] : 匹配除了x以外的任意字符
27 [^aeiou] : 匹配除了aeiou以外的任意字符
28 (?word>\w+) 或(?'word'\w+) 后向引用,用于重復(fù)搜索前面某個(gè)分組已經(jīng)匹配的文本,引用時(shí)就可以寫(xiě)成\kword>。實(shí)際上分組0對(duì)應(yīng)整個(gè)正則表達(dá)式;組號(hào)分配過(guò)程是從左到右分配兩遍的,第一遍先掃描未命名的分組,第二遍掃描已命名的分組,所以命名分組的組號(hào)永遠(yuǎn)大于未命名分組的組號(hào)的; 可以用(?:exp)來(lái)剝奪組號(hào)分配的參與權(quán)
29 分組命名的幾種語(yǔ)法: (exp) 匹配exp表達(dá)式并將文本匹配的內(nèi)容自動(dòng)分配到分組里;
(?name> exp)匹配exp表達(dá)式里的文本內(nèi)容到name組名下,也可以寫(xiě)成(?'name'exp); (?:exp)匹配exp表達(dá)式里內(nèi)容,但是不捕獲匹配的文本也不給匹配的文本分配組號(hào);(?=exp)匹配exp前面的位置; (?=exp)匹配exp后面的位置 ; (?!exp)匹配后面不是exp的位置 ; (?!exp) 匹配前面不是exp的位置; (?#comment)添加注釋,對(duì)正則表達(dá)式?jīng)]有任何影響;
30 (?=exp)與(?=exp)為零寬斷言,其中(?=exp)為零寬度正預(yù)測(cè)先行斷言,(?=exp)為零寬度正回顧后發(fā)斷言。(?=exp)表示自exp斷言表達(dá)式出現(xiàn)的位置開(kāi)始匹配斷言之前的內(nèi)容,如\b\w+(?=er\b) 源文件為tester,則匹配結(jié)果為:test。(?=exp)表示自exp斷言表達(dá)式內(nèi)容結(jié)束后的位置開(kāi)始匹配后面的內(nèi)容,如(?=test)\w+\b 源文件為test, 則匹配結(jié)果為:er。
31 {i}、{i,}、{i,j}:匹配指定數(shù)目的字符,這些字符是在它之前的表達(dá)式定義的。例如Perl正則表達(dá)式A[0-9]\{3\}能夠匹配字符"A"后面跟著正好3個(gè)數(shù)字字符的串,例如A123、A348等,但是不匹配A1234。Perl正則表達(dá)式[0-9]\{4,\}匹配連續(xù)的任意4個(gè)或4個(gè)以上數(shù)字字符。Perl正則表達(dá)式[0-9]\{4,6\}匹配連續(xù)的任意4個(gè)、5個(gè)或者6個(gè)數(shù)字字符。注意: 這個(gè)元字符不是所有的軟件都支持的
32 \ba\w*\b:匹配以字母a開(kāi)頭的單詞——先是某個(gè)單詞開(kāi)始處(\b),然后是字母a,然后是任意數(shù)量的字母或數(shù)字(\w*),最后是單詞結(jié)束處(\b)
更多語(yǔ)法詳情可以訪問(wèn)http://deerchao.net/tutorials/regex/regex.htm
到此這篇關(guān)于jmeter-正則表達(dá)式實(shí)例講解的文章就介紹到這了,更多相關(guān)jmeter正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Jmeter正則表達(dá)式提取器實(shí)現(xiàn)過(guò)程圖解
- jmeter設(shè)置全局變量與正則表達(dá)式提取器過(guò)程圖解