正则表达式.docx
《正则表达式.docx》由会员分享,可在线阅读,更多相关《正则表达式.docx(15页珍藏版)》请在冰点文库上搜索。
正则表达式
正则表达式
一、正则表达式介绍:
正则表达式是用某种模式去匹配一类字符串的公式。
在自动化的测试过程中经常需要对文本数据进行查找,对字符串进行比较匹配等,这个时候就需要用到正则表达式
元字符
说明
.
匹配任何单个字符
[xyz]
匹配括号中的任何一个字符
[^xyz]
匹配除了括号中的任何一个字符
[x-y]
匹配括号中字符区间内的任何一个字符
*
匹配0或多个正好在它之前的那个字符
+
匹配1或多个正好在它之前的那个字符
?
匹配0或1个正好在它之前的那个字符
()
将(和)之间的表达式定义为“组”
|
将多个匹配条件进行逻辑“或”运算
^
匹配输入字符串的开始位置
$
匹配输入字符串的结束位置
\w
匹配任何字母数字字符和下划线
\W
匹配任何非字母数字字符
\
用来将这里列出的这些元字符当作普通的字符来进行匹配
{}
匹配指定数目的字符
二、正则表达式特征
匹配任何单个字符(.)
.匹配任何单个字符。
例如正则表达式“…”匹配“12B”,“B3B”,“123”,“ABC”,“$g%”等。
匹配括号中的任何一个字符([xyz])
匹配方括号中的任何一个字符。
例如正则表达式“[abc][12]”匹配“a1”,“a2”,“b1”,“b2”,“c1”和“c2”。
匹配除了括号中的任何一个字符([^xyz])
这里的”^”用法是“排除”,匹配除了指定区间之外的字符。
例如“[^a][12]”与“a1”和“a2”不匹配,但是可以匹配“11”,“12”,“c1”等。
匹配括号中字符区间内的任何一个字符([x-y])
[d-h]结构的正则表达式将匹配在d到p之间的任何一个字符。
例如“[abcdef][123]”可以写出“[a-f][1-3]”
匹配0或多个正好在它之前的那个字符(*)
“*”用于匹配0或多个正好在它之前的那个字符。
例如“a*”可以匹配“a”,“aa”,“aaa”等,正则表达式“.*”意味着能够匹配任意数量的任何字符。
请看另外的一些例子:
“aa*”可匹配“a”,“aa”,“aaa”等;
“[abc][1-4]*”可匹配“a”,“b”,“c”,“a1”,“b1”,“a12”,“a1234344”等;
“User.*”可匹配任何以“User”开头的字符串。
*******************************************************************************
注意:
很多人会有这样的错误,用“User*”匹配以“User”开头的字符串,而“User*”只匹配像“Use”,“User”,“Userr”等
*******************************************************************************
匹配1或多个正好在它之前的那个字符(+)
“+”用于匹配1或多个正好在它之前的那个字符。
例如“aa*”可以等同于“a+”。
“123+”可匹配“123”,“1233”,“1233”等;
“[123]+”可匹配“1”,“2”,“3”,“12”,“23”等
匹配0或1个正好在它之前的那个字符(?
)
“?
”用于匹配0或1个正好在它之前的那个字符。
例如“a[123]?
”可匹配“a”,“a1”,“a2”和“a3”。
正则表达式分组(())
用括号“()”组成一个正则表达式。
例如(123)+匹配“123”,“123123”,“123123123”等,与“123+”的含义是不一样的。
匹配多个表达式中的一个(|)
“|”符号是指进行逻辑“或”运算。
例如“(123)|(abc)”可以匹配“123”或“abc”。
匹配输入字符串的开始位置(^)
“^”符号在正则表达式的开头用于匹配一行的开始。
例如“^abc.*”能够匹配以“abc”开始的字符串。
匹配输入字符串的结束位置($)
“$”符号在正则表达式的末尾用于匹配一行的结束。
例如“abc$”能够匹配“abc”,“123abc”,“aabc”等,而“^abc$”只能匹配“abc”。
匹配任何字母数字字符和下划线(\w)
“\w”可匹配任何字母数字和下划线。
这个用法与表达式“[A-Za-z0-9_]”是一样的。
例如“\w\w”能够匹配“A_”,“a1”等。
匹配任何非字母数字字符(\W)
“\W”可匹配任何非字母和非数字的字符,是与“\w”相反的,它可以等同于“[^A-Za-z0-9]”。
例如“\W”可以匹配“$”,“%”,“@”等。
转义字符(\)
。
。
匹配指定数目的字符({})
“{}”匹配X个正好在它之前的那个字符。
使用这个符号有多种方法,见表13-2
表13-2
字符
说明
举例
{M}
M个匹配的模式
A{2}仅可以匹配“AA”
{M,}
M个或更多个匹配的模式
A{1,}可以匹配“A”,“AA”等,这个表达式等同于“A+”,“A{0}”等同于“A*”
{M,N}
至少M个且至多N个匹配的模式
A{1,3}可以匹配“A”,“AA”和“AAA”
其他正则表达式字符
虽然在QTP的用户手册中没有列举所有的正则表达式字符,但是它支持所有的VBScript正则表达式字符。
下面表13-3中列出了其他的一些正则表达式符号。
表13-3
字符
说明
举例
\d
匹配0到9的任意数字,等同于“[0-9]”.
“\d{2}”可以匹配01到99的所有数字,但是它不匹配1到9的单数
\D
匹配任意的非数字字符,等同于“[^0-9]”.
“\D”可以匹配“A”,“&”,“$”等
\num
匹配num次,其中num是一个正整数,
“(\d)\|\|”willmatchnumbers”111”,”222”,”333”
举例:
1、
/[A-Z]/
将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/
将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/
将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/
将会与任何由字母和数字组成的字符串。
2、问题:
能够匹配如下三个字符串的正则表达式是什么?
“”,””,””
答:
(test|qa|www)\.app\.com
3、问题:
用以匹配日期型MM/DD/YY的正则表达式如何写?
答:
MM是1-12的数字,可以分成两部分,一部分是:
0-9一部分是两位的10,11,12
[0-9]|1[0-2],
DD是1-31的数字,可以分成三部分一部分是0-9一部分是10-19,一部分是20-29
一部分是30-31,可以这样写[0-9]|1[0-9]|2[0-9]|3[0-1]或[1-9]|[1-2][0-9]|3[0-1]
YY的正则表达式则是“[0-9][0-9]”。
组合起来日期型的正则表达式就是“([1-9]|1[0-2])/([1-9]|[1-2][0-9]|3[0-1])/([0-9][0-9])”。
三、在QTP中使用正则表达式
'为文本框创建一个Description对象
SetoTextBox=Description.Create
'此正则表达式匹配以name的值
oTextBox("name").value="name.*"
'此属性默认的情况下市true,所以可以忽略此行代码
oTextBox("name").RegularExpression=True
'访问name属性以那么开头的第一个文本框
oTextBox("index").value=0
'Setthevalueofthetextbox
Browser("").Page("").WebEdit(oTextBox).Set"Value"
四、正则表达式的实际应用
4.1描述性编程中的应用
正常的测试判断脚本:
IfBrowser("PetShop").Page("PetShop").WebArea("Fish").Existthen
…
Endif
XX例1:
systemutil.Run"iexplore.exe","
IfBrowser("title:
=.*").Page("title:
=.*").WebArea("src:
=.*/baidu_logo_jr_1004_ysh.gif").Existthen
msgbox"成功"
EndIf
XX例2:
测试需求:
判断XX首页右下角的链接是否以5个字母开头,并且,首字母是大写
[A-Z][a-z][a-z][a-z][a-z]+
systemutil.Run"iexplore.exe","
IfBrowser("title:
=.*").Page("title:
=.*").Link("innertext:
=[A-Z][a-z][a-z][a-z][a-z].*","Url:
=then
msgbox"成功"
EndIf
4.2检查点中的应用
例题:
XX首页,验证XX首页的ICP年度文本一行,是否以©2010格式开头
步骤:
1、把XX首页所有的对象加载到对象库中
2、在XX文本框中输入任意字符(目的,在关键字视图中能看到XX首页,方便在关键字视图中进行操作)
3、在ActiveScreen中选中最下面一行文本
4、点击ok之后,专家视图的脚本如下
systemutil.Run"iexplore.exe","
Browser("title:
=.*").Page("title:
=.*").CheckCheckPoint("XX一下,你就知道")
Browser("PetShop").Page("XX一下,你就知道").CheckCheckPoint("XX一下,你就知道")
5、运行,结果通过
Details
TextCheckpoint:
captured"©2010Baidu使用XX前必读京ICP证030173号"betweenAboutBaiduand
RegularExpression:
ON
Matchcase:
OFF
Exactmatch:
OFF
Ignorespaces:
ON
注:
如果改成@[0-9][0-9][0-9][a-z].*就运行不成功
4.3参数化中的应用
例子:
在人才网输入不同的关键字之后,会列出公司名,或者职位名包含关键字的所有数据,现在把关键字,和匹配的正则参数化,验证以某关键子字搜索之后,列表中的公司名和职位名是否包含关键字。
systemutil.CloseProcessByName("iexplore.exe")
systemutil.Run"iexplore.exe","
Browser("title:
=.*").Page("title:
=.*").Sync
Setdocument=Browser("title:
=.*").Page("title:
=.*").Object
document.GetElementsByName("keyword").item(0).value=datatable("searchkeyword",dtGlobalSheet)
setsearchbuttons=document.GetElementsByTagName("INPUT")
Foreachelementinsearchbuttons
Ifelement.type="image"andelement.alt="搜索职位"Then
element.click
EndIf
Next
Browser("title:
=.*").Page("title:
=.*").Sync
SetoDivs=document.GetElementsByTagName("DIV")
Fori=0tooDivs.length-1
IfoDivs.item(i).innertext="企业招聘信息"Then
Flag=Flag+1
SetmyDiv=oDivs.item(i)
EndIf
Next
IfFlag=1Then
Flag=0'意为何意
SetstrCompanyNameTitleDIV=myDiv.parentNode
IfTrim(strCompanyNameTitleDIV.classname="texttitle")Then
Setmysearchdiv=strCompanyNameTitleDIV.NextSibling
Setmychilddivs=mysearchdiv.ChildNodes
'因为要循环显示所有行的数据,所以要获得所有行的DIV元素,然后循环显示他们
Fori=0tomychilddivs.length-1'所有数据的行数
Iftrim(mychilddivs.item(i).classname)="row"ortrim(mychilddivs.item(i).classname)="rowhl"Then
Flag=Flag+1
'firstchild....是搜索此子节点中的所有子节点,但不包括父节点
strCompanyName=mychilddivs.item(i).firstchild.getElementsbyTagName("DIV").item
(1).innertext
strCompanyContent=mychilddivs.item(i).firstchild.NextSibling.getElementsbyTagName("DIV").item(0).innertext
MergeString=strCompanyName&strCompanyContent
IfRegExpTest(datatable("RegPatten",dtGlobalSheet),MergeString)=trueThen
print"第"&i+1&"行匹配成功此行的标题是"&strCompanyName
Else
print"第"&i+1&"行匹配不成功此行的标题是"&strCompanyName
EndIf
endif
Next
EndIf
EndIf
SetoDIVs=Nothing
Setdocument=Nothing
FunctionRegExpTest(patm,strng)
DimregEx,retVal
SetregEX=NewRegExp
regEx.Pattern=patm
regEx.IgnoreCase=False
retVal=regEx.Test(strng)
IfretValThen
RegExpTest=True
Else
RegExpTest=False
EndIf
EndFunction
4.4RegExp对象
RegExp对象支持正则表达式的使用,RegExp提供了三个属性和方法
属性:
Pattern,Global,IgnoreCase
方法:
Test,Replace,Execute
Pattern:
属性用于描述正则表达式的匹配模式,即正则表达式
IgnoreCase:
属性匹配字符串是否区分大小写,True为不区分大小写
Global:
属性用于搜索过程中是匹配第一个还是全部匹配,false仅匹配第一个
Execute:
用于对指定的字符串执行正则表达式搜索,返回一个matchs集合,其中包含了指定字符串中找到的每个匹配项
对集合里边的任何一个元素使用FirstIndex代表字符在字符串中的位置
Value代表一个元素的值
Test:
方法用于对指定的字符串执行正则表达式搜索,并返回一个布尔值,表示是否找到了匹配模式
Replace:
用于替换在正则表达式中找到的文,结果返回匹配后的字符串
如:
IFregEX.Test(string)=Truethen
MsgboxregEx.Replace(string,”ABC”)
EndIF
例题:
如下可以用来匹配字符串,比用字符串函数更加方便。
FunctionRegExpTest(sPattern,sString,rePattern,replacestring)
DimregExp,Matches,Str,Matcheslast
SetregExp=NewRegExp
regExp.Pattern=sPattern'创建一个正则表达式
regExp.IgnoreCase=True'不区分大小写
regExp.Global=True'设置全局可用,即在整个字符串中进行搜索
SetMatches=regExp.execute(sString)
ForeachMatchinMatches
Str=Str&"在字符串中的位置为:
"&Match.FirstIndex&"值为:
"&Match.Value&vbCrlf
Next
IfregExp.Test(sString)Then'测试表达式是否匹配字符串
sString=regExp.Replace(sString,replacestring)'把所有匹配的字符替换成AB,结果返回匹配后的字符串
msgbox"匹配成功,替换后的文本为"&sString
EndIf
EndFunction
msgboxRegExpTest("is.","IS1is2IS3is4","ab.","AB")