正则表达式的语法一般如下js
,两条斜线中间是正则主体,这部分可以有很多字符组成;i
部分是修饰符,i
的意思表示忽略大小写
/^abc/i
正则定义了很多特殊意义的字符,有名词,量词,谓词等
在线工具可以使用这个,点击【前往】
没有特殊意义的字符都是简单字符,简单字符就代表自身,绝大部分字符都是简单字符
/abc/ // 匹配 abc
/123/ // 匹配 123
/-_-/ // 匹配 -_-
/海镜/ // 匹配 海镜
\
是转义字符,其后面的字符会代表不同的意思,转义字符主要有三个作用:
第一种,是为了匹配不方便显示的特殊字符,比如换行,
tab
符号等第二种,正则中预先定义了一些代表特殊意义的字符,比如
\w
等第三种,在正则中某些字符有特殊含义(比如下面说到的),转义字符可以让其显示自身的含义
下面是常用转义字符列表:
有时我们需要匹配一类字符,字符集可以实现这个功能,字符集的语法用[]
分隔,下面的代码能够匹配a
或b
或c
[abc]
如果要表示字符很多,可以使用-
表示一个范围内的字符,下面两个功能相同
[0123456789]
[0-9]
在前面添加^
,可表示非的意思,下面的代码能够匹配abc
之外的任意字符
[^abc]
其实正则还内置了一些字符集,在上面的转义字符有提到,下面给出内置字符集对应的自定义字符集
.
匹配除了换行符\n
以外的任意一个字符 =[^\n]
\w
=[0-9a-Z_]
\W
=[^0-9a-Z_]
\s
=[ \t\n\v]
\S
=[^ \t\n\v]
\d
=[0-9]
\D
=[^0-9]
如果我们有三个苹果,我们可以说自己有个3个苹果,也可以说有一个苹果,一个苹果,一个苹果,每种语言都有量词的概念
如果需要匹配多次某个字符,正则也提供了量词的功能,正则中的量词有多个,如?、+、*、{n}、{m,n}、{m,}
{n}匹配n次,比如a{2},匹配aa
{m, n}匹配m-n次,优先匹配n次,比如a{1,3},可以匹配aaa、aa、a
{m,}匹配m-∞次,优先匹配∞次,比如a{1,},可以匹配aaaa...
?匹配0次或1次,优先匹配1次,相当于{0,1}
+匹配1-n次,优先匹配n次,相当于{1,}
*匹配0-n次,优先匹配n次,相当于{0,}
正则默认和人心一样是贪婪的,也就是常说的贪婪模式,凡是表示范围的量词,都优先匹配上限而不是下限
a{1, 3} // 匹配字符串'aaa'的话,会匹配aaa而不是a
有时候这不是我们想要的结果,可以在量词后面加上?
,就可以开启非贪婪模式
a{1, 3}? // 匹配字符串'aaa'的话,会匹配a而不是aaa
有时我们会有边界的匹配要求,比如已xxx
开头,已xxx
结尾
^
在[]
外表示匹配开头的意思
^abc // 可以匹配abc,但是不能匹配aabc
$
表示匹配结尾的意思
abc$ // 可以匹配abc,但是不能匹配abcc
上面提到的\b
表示单词的边界
abc\b // 可以匹配 abc ,但是不能匹配 abcc
有时我们想匹配x
或者y
,如果x
和y
是单个字符,可以使用字符集,[abc]
可以匹配a
或b
或c
,如果x
和y
是多个字符,字符集就无能为力了,此时就要用到分组
正则中用|
来表示分组,a|b
表示匹配a
或者b
的意思
123|456|789 // 匹配 123 或 456 或 789
分组是正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx)
(abc){2} // 匹配abcabc
分组不能放在[]
中,分组中还可以使用选择表达式
(123|456){2} // 匹配 123123、456456、123456、456123
和分组相关的概念还有一个捕获分组和非捕获分组,分组默认都是捕获的,在分组的(
后面添加?:
可以让分组变为非捕获分组,非捕获分组可以提高性能和简化逻辑
'123'.match(/(?:123)/) // 返回 ['123']
'123'.match(/(123)/) // 返回 ['123', '123']
和分组相关的另一个概念是引用,比如在匹配html
标签时,通常希望
后面的xxx
能够和前面保持一致
引用的语法是\
数字,数字代表引用前面第几个捕获分组,注意非捕获分组不能被引用
<([a-z]+)><\/\1> // 可以匹配 `` 或 ``等
如果你想匹配xxx
前不能是yyy
,或者xxx
后不能是yyy
,那就要用到预搜索
js
只支持先行预搜索,也就是xxx
前面必须是yyy
,或者xxx
前面不能是yyy
(?=1)2 // 可以匹配12,不能匹配22
(?!1)2 // 可以匹配22,不能匹配12
默认正则是区分大小写,这可能并不是我们想要的,正则提供了修饰符的功能,修复的语法如下
/xxx/gi // 最后面的g和i就是两个修饰符
g
正则遇到第一个匹配的字符就会结束,加上全局修饰符,可以让其匹配到结束
i
正则默认是区分大小写的,i
可以忽略大小写
m
正则默认遇到换行符就结束了,不能匹配多行文本,m
可以让其匹配多行文本
1、数字:
^[0-9]*$
2、
n
位的数字:^\d{n}$
3、至少
n
位的数字:^\d{n,}$
4、
m-n
位的数字:^\d{m,n}$
5、零和非零开头的数字:
^(0|[1-9][0-9]*)$
6、非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(\.[0-9]{1,2})?$
7、带1-2位小数的正数或负数:
^(\-)?\d+(\.\d{1,2})$
8、正数、负数、和小数:
^(\-|\+)?\d+(\.\d+)?$
9、有两位小数的正实数:
^[0-9]+(\.[0-9]{2})?$
10、有1~3位小数的正实数:
^[0-9]+(\.[0-9]{1,3})?$
11、非零的正整数:
^[1-9]\d*$
或^([1-9][0-9]*){1,3}$
或^\+?[1-9][0-9]*$
12、非零的负整数:
^\-[1-9][]0-9"*$
或^-[1-9]\d*$
13、非负整数:
^\d+$
或^[1-9]\d*|0$
14、非正整数:
^-[1-9]\d*|0$
或^((-\d+)|(0+))$
1、汉字:
^[\u4e00-\u9fa5]{0,}$
2、英文和数字:
^[A-Za-z0-9]+$
或^[A-Za-z0-9]{4,40}$
3、长度为3-20的所有字符:
^.{3,20}$
4、由26个英文字母组成的字符串:
^[A-Za-z]+$
5、由26个大写英文字母组成的字符串:
^[A-Z]+$
6、由26个小写英文字母组成的字符串:
^[a-z]+$
7、由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
8、由数字、26个英文字母或者下划线组成的字符串:
^\w+$
或^\w{3,20}$
9、中文、英文、数字包括下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
10、中文、英文、数字但不包括下划线等符号:
^[\u4E00-\u9FA5A-Za-z0-9]+$
或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11、可以输入含有
^%&',;=?$\"
等字符:[^%&',;=?$\x22]+
12、禁止输入含有
~
的字符:[^~\x22]+
1、
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2、域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?
3、
InternetURL
:[a-zA-z]+://[^\s]*
或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4、手机号码:
^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5、电话号码(
XXX-XXXXXXX
、XXXX-XXXXXXXX
、XXX-XXXXXXX
、XXX-XXXXXXXX
、XXXXXXX
和XXXXXXXX
):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6、国内电话号码(
0511-4405222
、021-87888822
):\d{3}-\d{8}|\d{4}-\d{7}
7、电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号):
((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
8、身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符
X
:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
9、帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10、密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$
11、强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
12、强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
13、日期格式:
^\d{4}-\d{1,2}-\d{1,2}
14、一年的12个月(01~09和1~12):
^(0?[1-9]|1[0-2])$
15、一个月的31天(01~09和1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$
16、
xml
文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
17、腾讯
[1-9][0-9]{4,}
(腾讯QQ号从10000开始)18、中国邮政编码:
[1-9]\d{5}(?!\d)
(中国邮政编码为6位数字)19、
IPv4
地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
20、空白行的正则表达式:
\n\s*\r
(可以用来删除空白行)
本人每篇文章都是一字一句码出来,希望大佬们多提提意见。顺手来个三连击,点赞收藏关注✨。创作不易,给我打打气,加加油☕