一文教你学会正则表达式的基本使用
正则表达式的基本使用
♡ \color{red}{\heartsuit} ♡
1.什么是正则表达式
正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。
2.正则表达式目的
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)
- 可以通过正则表达式,从字符串中获取我们想要的特定部分。
3.正则表达式符号
正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。
常用元字符
符号 | 含义 |
---|---|
^ | 表示匹配字符串的开始位置,多行模式下匹配每一行的行首 。(注意:用在中括号中[ ]时,可以理解为取反,表示不匹配括号中的字符串) |
$ | 表示匹配字符串的结束位置,多行模式下匹配每一行的行尾 |
* | 表示匹配零次到多次。 例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。\*等价于o{0,} |
+ | 表示匹配一次到多次(至少有一次)。例如“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 |
? | 表示匹配零次或一次。例如“do(es)?”可以匹配“do”或“does”。?等价于{0,1}。 |
. | 表示匹配单个字符(除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式) |
| | 表示为或者,两项中取一项 |
( ) | 小括号表示匹配括号中全部字符 |
[ ] | 中括号表示匹配括号中一个字符范围描述。如[0-9 a-z A-Z] |
{ } | 大括号用于限定匹配次数。如{n}表示匹配n个字符; {n,}表示至少匹配n个字符;{n,m}表示至少n,最多m。 |
\ | 转义字符 如上基本符号匹配都需要转义字符。如*表示匹配*号 |
\w | 表示英文字母和数字 |
\W | 非字母和数字 |
\d | 表示数字 |
\D | 非数字 |
\n | 匹配一个换行符 |
等价字符
等价是等同于的意思,表示同样的功能,用不同符号来书写。
?,*,+,\d,\w 都是等价字符
- ?等价于匹配长度{0,1}
- *等价于匹配长度{0,}
- +等价于匹配长度{1,}
- \d等价于[0-9]
- \D等价于[^0-9]
- \w等价于[A-Za-z_0-9]
- \W等价于[^A-Za-z_0-9]
懒惰限定符
贪婪(贪心) 如"*"字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的。
懒惰(勉强) 如 “?” 懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。
“*?” 重复任意次,但尽可能少重复
如 “acbacb” 正则 “a.*?b” 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb"
“+?” 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次
“{n,m}?” 重复n到m次,但尽可能少重复
如 “aaaaaaaa” 正则 “a{0,m}” 因为最少是0次所以取到结果为空
“{n,}?” 重复n次以上,但尽可能少重复
如 “aaaaaaa” 正则 “a{1,}” 最少是1次所以取到结果为 “a”
组合
.*具有贪婪的性质,匹配到不能匹配为止,最大匹配原则。
+或后跟?表示非贪婪匹配,即尽可能少的匹配,最小匹配原则。
.? 表示在能匹配成功的前提下尽可能少的匹配,最小匹配原则。
♠ \color{red}{\spadesuit} ♠
4.正则表达式的应用实例
1.校验是否全由数字组成
/^[0-9]{1,20}$/
^ 表示打头的字符要匹配紧跟^后面的规则
$ 表示打头的字符要匹配紧靠$前面的规则
[ ] 中的内容是可选字符集
[0-9] 表示要求字符范围在0-9之间
{1,20}表示数字字符串长度合法为1到20,即为[0-9]中的字符出现次数的范围是1到20次。
/^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。
2.校验登录名:只能输入5-20个以字母开头、可带数字、“”、“.”的字串
/^[a-zA-Z]{1} ([a-zA-Z0-9]|[._]){4,19}$/
^[a-zA-Z]{1} 表示第一个字符要求是字母
([a-zA-Z0-9] | [._]){4,19} 表示从第二位开始(因为它紧跟在上个表达式后面)的一个长度为4到9位的字符串,它要求是由大小写字母、数字或者特殊字符集[.]组成。
3.校验用户姓名:只能输入1-30个以字母开头的字串
/^[a-zA-Z]{1,30}$/
4.校验密码:只能输入6-20个字母、数字、下划线
/^(\w){6,20}$/
\w:用于匹配字母,数字或下划线字符
5.校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”
/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/
\d:用于匹配从0到9的数字;
“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次
可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等
6.校验URL
/^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的长度为length(“https://”) + n )
\ / :表示字符“/”。
. 表示所有字符的集
+ 等同于{1,},就是1到正无穷
正则表达式的练习
符号 | 含义 |
---|---|
“^\d+$” | 非负整数(正整数+0) |
“^[0-9]*[1-9][0-9]*$” | 正整数 |
“^((-\d+)|(0+))$” | 非正整数(负整数+0) |
“^-[0-9]*[1-9][0-9]*$” | 负整数 |
“^-?\d+$” | 整数 |
“^\d+(\.\d+)?$” | 非负浮点数(正浮点数+0) |
“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” | 正浮点数 |
“^((-\d+(\.\d+)?)|(0+(\.0+)?))$” | 非正浮点数(负浮点数+0) |
“^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$” | 负浮点数 |
“^(-?\d+)(\.\d+)?$” | 浮点数 |
“^[A-Za-z]+$” | 由26个英文字母组成的字符串 |
“^[A-Z]+$” | 由26个英文字母的大写组成的字符串 |
“^[a-z]+$” | 由26个英文字母的小写组成的字符串 |
“^[A-Za-z0-9]+$” | 由数字和26个英文字母组成的字符串 |
“^\w+$” | 由数字、26个英文字母或者下划线组成的字符串 |
“^[\w-]+(.[\w-]+)*@[\w-]+(.[\w-]+)+$” | email地址 |
“^[a-zA-z]+://(\w+(-\w+)*)(.(\w+(-\w+)*))*(\?\S*)?$” | url |
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ | 年-月-日 |
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ | 月/日/年 |
“^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” | |
“(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?” | 电话号码 |
“^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$” | IP地址 |
^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$ | YYYY-MM-DD基本上把闰年和2月等的情况都考虑进去了 |
5.常用的正则匹配工具
在线匹配工具:
1、 http://www.regexpal.com/
2、https://rubular.com/
6.正则表达式在jmeter中的应用
假设有这样一个响应报文,要提取token,正则表达式如何写?
{
"msg": "成功调用",
"code": 0,
"data": {
"pmoney": 100.0,
"createtime": 1651931348194,
"sex": 1,
"mobile": "15889209503",
"token": "bLaAwfXSZwARL+9CLbU7NiG6TeoVo+CaEyS92RRnyeUowDqmFmux0qaXE0ugHCYVxRU\/jxaEwo\/fQbjJJq9BrA==",
"lasttime": 1651931348194,
"money": 0.0,
"gqid": "4000045",
"identity": "cc53eea227dd92a7",
"id": 160116,
"age": 20,
"email": "[email protected]",
"username": "test11"
}
}
如下:我们这里的需求是提取一个值,那如果一个正则表达式提取器要提取多个值呢?
假设我们要提取code和token,这两个值之间还有其他值,要如何写正则提取式呢?
一个正则提取器,写多个正则提取式:分隔符用 (.*?)
"code":"(.*?)",(.*?),"token":"(.*?)"
那么要如何引用提取的变量呢?
通过察看结果树可以看到要提取的值在regtk_1_g1和regtk_1_g3,那么如果要引用该变量直接${regtk_1_g1}即可
JMeter中还有JSON提取器、XPath提取器可以提取。