一文教你学会正则表达式的基本使用

正则表达式的基本使用

♡ \color{red}{\heartsuit}

1.什么是正则表达式

正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。

2.正则表达式目的

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  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})(]?)$” Email
“(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提取器可以提取。

参考文章:
关于正则表达式基本语法的应用详解(必看篇)
正则表达式-百度百科
正则表达式基本语法详解
添加链接描述

猜你喜欢

转载自blog.csdn.net/weixin_41948075/article/details/123377478