修饰符
修饰符 | 描述 |
---|---|
i |
不区分大小写 |
g |
全局匹配(查找所有匹配而非在找到第一个匹配后停止) |
m |
执行多行匹配 |
方括号
表达式 | 描述 |
---|---|
[abc] |
查找方括号之间的任何字符。 |
[^abc] |
查找任何不在方括号之间的字符。 |
[0-9] |
查找任何从 0 至 9 的数字。 |
[a-z] |
查找任何从小写 a 到小写 z 的字符。 |
[A-Z] |
查找任何从大写 A 到大写 Z 的字符。 |
[A-z] |
查找任何从大写 A 到小写 z 的字符。 |
[adgk] |
查找给定集合内的任何字符。 |
[^adgk] |
查找给定集合外的任何字符。 |
**`(red | blue |
元字符
元字符 | 描述 |
---|---|
. |
查找单个字符,除了换行和行结束符。 |
\w |
查找单词字符(包括英文字母,数字,下划线)。 |
\W |
查找非单词字符(包括非英文字母,数字,下划线之外的字符) |
\d |
查找数字 |
\D |
查找非数字字符。 |
\s |
查找空白字符。 |
\S |
查找非空白字符。 |
\b |
匹配单词边界。 |
\B |
匹配非单词边界。 |
\0 |
查找 NUL 字符。 |
\n |
查找换行符。 |
\f |
查找换页符。 |
\r |
查找回车符。 |
\t |
查找制表符。 |
\v |
查找垂直制表符。 |
\xxx |
查找以八进制数 xxx 规定的字符。 |
\xdd |
查找以十六进制数 dd 规定的字符。 |
\uxxxx |
查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词
量词 | 描述 | 备注 |
---|---|---|
n+ |
匹配任何包含至少一个 n 的字符串。 | |
n* |
匹配任何包含零个或多个 n 的字符串。 | |
n? |
匹配任何包含零个或一个 n 的字符串。 | |
n{X} |
匹配包含 X 个 n 的序列的字符串。 | |
n{X,Y} |
匹配包含 X 或 Y 个 n 的序列的字符串。 | |
n{X,} |
匹配包含至少 X 个 n 的序列的字符串。 | |
n$ |
匹配任何结尾为 n 的字符串。 | |
^n |
匹配任何开头为 n 的字符串。 | |
?=n |
匹配任何其后紧接指定字符串 n 的字符串。 | |
?!n |
匹配任何其后没有紧接指定字符串 n 的字符串。 |
基础表达式组合
常用正则表达式解析
邮箱正则
正则一
[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}
此正则来自[0-9a-zA-Z_.-]
方括号的含义是匹配方括号内的任意字符。所以这段内容要匹配的就是【0到9,小写a到小写z,大写A到大写Z,**_
** (下划线),**.
** (点),-
(中划线)】,只要在这个范围内都会被匹配到。再翻译一下这段内容就是[0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.-]
的简写[0-9a-zA-Z_.-]+
多了个加号,**+
** 表示最少匹配一个。所以这段就是【在这个范围内的字符,最少要有一个,最多不限制】[0-9a-zA-Z_.-]+[@]
又多了个[@]
,也就是说后面需要再跟一个**@
**[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-
继续再分析,现在又多了和开头一样的内容,也就表明**@
** 后面需要在跟同样的字符[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+
继续看,多了加号,也就表明**@
** 后面最少跟一个满足条件的字符,多了不限[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+)
多了个小括号,小括号内有两个方括号和一个加号,第一个方括号内是一个点**.
** ,也就是说满足了之前条件后,需要紧跟着的是一个点(asf@gmail
后面需要跟一个点);第二个方括号内是[a-zA-Z]
,也就是**.
** 后面必须跟字母(小写a到小写z,大写A到大写Z);**+
** 说明**.
** 后最少跟一个字母,最多不限制[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}
小括号后多了个{1,2}
,说明这个修饰的是括号内的内容,也就是最少匹配括号内的一个内容最多两个(.cn.com
就是满足条件的)。
- 分析完了之后,我们可以对此进行一下简化和修改
^[0-9a-zA-Z_.-]+
原始第一部分这些条件的字符长度不限制。我们可以这样修改**[0-9A-z_.-]{6,20}
** ,首先字符长度最少6位,最多不能超过20位,其次a-zA-Z
我们进行了简化A-z
;我们还在方括号前加了**^
** ,表示,必须以这些字符开头,并且长度在6到20之间。- 接下来的**
[@]
** 没有问题,我们不需要修改 [0-9a-zA-Z_.-]+
第三部分同样不限制长度,我们也改一下,改成**[0-9A-z_-]{1,8}
** ,首先方括号内删去了**.
** 的匹配,因为这部分后面就绪跟**.域名了
** ,然后字母匹配作了简写,最后限制了长度1到8。因为QQ邮箱@
后也就两位,谷歌邮箱@
后也就5位,主流的邮箱基本也都在这个范围内了,超出这个范围的邮箱,也不是什么主流的了(最主要重点是正则)。([.][a-zA-Z]+){1,2}
这部分改成**([.][A-z]{2,3}){1,2}$
** ,字母进行了简写,限制了结尾,如果不限制结尾,那么像.cn.com.cn.com.cn.com
都可以验证通过- 最终结果**
^[0-9A-z._-]{6,20}[@][0-9A-z_-]{1,8}([.][A-z]{2,3}){1,2}$
**
自用正则
金额输入
条件
- 金额必须存在,不能是0
- 整数位最多8位
- 小数点后最多两位
- 只能有一个小数点
分析
必须以数字开头和数字结尾
如果以**
0
开头,则整数位只可以有一个0
,且0
** 后面必须有一个小数点**.
**- 小数点后的第一位如果还是**
0
** ,则必须有第二位,且第二位只可以为**1-9
** 的数字,并且以**1-9
** 结尾。(即:0.03
是验证通过的,0.030
0.031
是验证不通过的) - 小数点后第一位如果是**
1-9
** ,则第二位可有可无,并且第二位可以为**0-9
** 的任意数字,并且以此结尾
- 小数点后的第一位如果还是**
如果以**
1-9
** 的数字开头,则可以直接以此结尾或者以**
1-9
** 的数字开头,后面紧跟一个小数点**.
**,小数点后紧跟两位任意数字,并以此结尾。(即:12.00
12.01
12.10
是验证通过的,12.
是验证不通过的)
/(^[0][.](([0][1-9]$)|([1-9][\d]?$)))|((^[1-9]{1,8}$)|(^[1-9]{1,8}[.][\d]{1,2}$)?)/
重置Img样式
背景: 小程序上做富文本解析,但是富文本的图片用户可以自定义宽高,并且单位还是px,在小程序上会造成左右滑动,图片过大问题,所以需要重置富文本的图片样式;
富文本示例代码:
1 | <p>第一个段落</p>\n\n<p><img alt=\"\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254145446.jpeg\" /></p>\n\n<p>第二个段落测试</p>\n\n<p> </p>\n\n<p>第三个段落测试<img alt=\"图片二\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254190286.jpeg\" style=\"height:1200px; width:1920px\" /><img alt=\"有宽无高\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254224672.jpeg\" style=\"width:2293px\" /><img alt=\"有宽有高\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254297352.jpeg\" style=\"height:1200px; width:1920px\" /><img alt=\"有边框\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254344643.jpeg\" style=\"border-style:solid; border-width:4px; height:1200px; width:1920px\" /><img alt=\"有边距\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254394748.jpeg\" style=\"border-style:solid; border-width:5px; float:right; height:1200px; margin:30px 25px; width:1920px\" /><img alt=\"乱序设置\" src=\"http://editor2019.oss-cn-beijing.aliyuncs.com/2019/12/2/1575254473318.jpeg\" style=\"border-style:solid; border-width:20px; height:500px; margin-bottom:17px; margin-top:17px; width:800px\" /></p>\n |
分析
需要重置的只能是img标签的style,而不能是其他标签的style
所以匹配
<img
和/>
之间的style1
/(?<=(<img.+\s))(style)(?=(.+\s\/>))/gi
进一步,只匹配
<img
和/>
内部的style
的width
和height
/(?<=((<img.+\s))(style.+\s))(width)(?=(.+\s\/>))/gi
/(?<=((<img.+\s))(style.+\s))(height)(?=(.+\s\/>))/gi