写这篇的初衷是在学习jmeter关联,发现可以通过正则表达式对获取的数据作为参数放入下一个请求中,那么就要对正则表达式有所了解,我感觉正则表达式一般的能看懂,能写一些简单的应该可以,后面会写一篇关于关联的案例,加油!是在网上找到的30分钟搞懂正则表达式w3cschool,算是一个自己的理解总结吧
1、正则表达式作用:其实就是记录文本规则的代码,把文本中匹配的数据查找出来
2、入门:
\b:表示单词的开头或结尾,只匹配一个位置
.:匹配除换行符以外的任意字符
*:连续重复任意匹配,重复>=0次
+: 重复>=1次
?:重复0或1次
{n}:重复n次
{n,}:重复大于n次
{n,m}:重复n到m次
.*:表示任意数量不包含换行的字符
-:普通连字符
\d: 匹配数字
\s:匹配任意空白符,包括空格、Tab、换行符等
\d+: 匹配1个或更多连续的数字
\w: 匹配字母或数字或下划线
^: 匹配字符串的开始
$: 匹配字符串的结束
\: 字符转义,用来防止有歧义的标点符号被转义
|:分支,相当于或,要注意个分支的顺序
普通查找所有包含‘hi’的字符:表达式 hi -->him,history
精确查找hi的字符:表达式\bhi\b-->hi
查找hi开头,yy结尾的字符:表达式:\bhi\b.*\byy\b
0\d{2}-\d{8}:0开头2个数字-8个数字的字符串
\ba\w*\b:匹配以a开头的单词 如 adfdf apple 结果:apple
\b\w{6}\b:匹配6个字符的单词
整个字符串是5位到12位数字:^\d{5,12}$
字符串包含5位到12位数字:\d{5,12}
c:\\Windows 匹配 c:\Windows
hello\d+:匹配hello后加1个或多个数字
^\w+:匹配一行第一个单词
[asdfs]:匹配任一字母
\(?0\d{2}[) -]?\d{8}:解释 ‘\(’转义,‘?’出现0次或1次,然后0,2个数字,‘[) -]?’空格)-一次或不出现,最后8个数字 可以匹配的有:(012)88888888,011-78787878等
0\d{2}-d{8}|0\d{3}-\d{7}:包含0开头2个数字-8个数字或0开头3个数字-7个数字的字符如:010-23423434,0513-23423421
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}:(0,2个数字),-或空格出现1次或0次,8个数字或02个数字,-或空格存在一次或0次,8个数字
\d{5}-\d{4}|\d{5} 5个数字-4个数字或者5个数字,若为\d{5}|\d{5}-\d{4} 表示:只匹配5个数字,不会考虑后面4位情况
二、反义
反义其实就是反过来匹配,一般都是大写
\W 匹配不是任意字母、数字、下划线、汉字等字符
\S 匹配任意不是空白的字符
\D 匹配不是数字的字符
\B 匹配不是字母开头或结束的位置
[^x] 匹配除x以外的任意字符
\S+ 匹配不是空白字符的字符串
<a[^>]+> 匹配<a+>,尖括号以a开头的字符串
三、后向引用、断言
\b(\w+)\b\s+\1\b 匹配重复的单词 解释:大于1个的字母或数字,放入编号为1匹配的分组中,然后是1个或几个空白符,然后是前面捕获的内容
(?=exp)零宽度正预测先行断言,断言自身出现位置后面能匹配表达式exp
\b\w+(?=ing\b) 匹配以ing结尾的单词的前面部分 如:i'm singing -->sing
(?<=exp) 零宽度正回顾后发断言,其实就是匹配后部分的字符 如:
(?<=\bre)\w+\b 匹配以re开头的单词后半部分 如 reading a book ->ading
(?<=\s)\d+(?=\s) 匹配以空白符间隔的数字 前后都匹配空白符,中间为数字
(?!exp)零宽度负预测先行断言 断言此位置后面不匹配exp
如:\d{3}(?!\d) 匹配三位数字,且后面不能是数字
\b((?!abc)\w)+\b 匹配不包含连续字符串abc的单词
(?<!exp)零宽度负回顾后发断言 断言此位置前面不匹配exp
如:(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字
(?<=<(\w+)>).*(?=<\/\1) 匹配不包含html标签里面的内容 解释:(?<=<(\w+)>)匹配<字符> .*任意字符串 匹配</字符>
四、贪婪与懒惰
a.*b 匹配最长以a开始,b结束的字符串
a.*?b 匹配最短,以a开始,b结束的字符串, 若为aabab-->aab,ab 原因:最先开始匹配的有最高优先权
五、补充
(?(exp)yes|no) 若匹配成功则使用yes的表达式,若不匹配成功则使用no的表达式 相当于java中的三目运算符
(?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用空表达式作为no