# 正则小结
# 介绍
# 3个重要的正则式命令
正则语法最重要的3个东西
- 括号
- [] 内部是需要匹配的字符
- {} 内部是指定匹配字符的数量
- () 是用来分组的
- 插入符号
^
表示开始 - 美元符号
$
表示结束
举个简单例子:
^([a-z]{1,2})([1-9]{2})$
我们一段一段分析:
- 掐头去尾只剩下中间部分:
([a-z]{1,2})([0-9]{2})
- 它是2个
()
组成的,先分析第1个
[a-z]{1,2}
其中,[]
表示要求匹配从a到z之间的字母,{1,2}
表示匹配1到2个字符。
- 第2个
[0-9]{2}
表示2位长度的数字
所以这个表达式可以验证开头前一两个字符为小写字母,紧接着为2位数字结尾的字符串。 比如符合条件有:
ab12
a12
不符合条件的有:
a123
ab123
A123
1234
如果去掉最后的$
,如
^([a-z]{1,2})([1-9]{2})
则这几个也符合条件了:
ab123
a123
# 常用快捷命令
可以使用下面的命令来简写正则。
命令 | 等价 | 描述 |
---|---|---|
\d | [0-9] | 数字 |
\D | [^0-9] | 非数字 |
\w | [A-Za-z0-9_] | 包括下划线的任何单词字符 |
\W | [^A-Za-z0-9_] | 非单词字符 |
* | {0,} | 匹配前面的子表达式0到多次 |
+ | {1,} | 匹配前面的子表达式1到多次 |
? | {0,1} | 匹配前面的子表达式0到1次 |
. | [^\r\n] | 除了回车符和换行符之外的所有字符 |
# 用例
# 手机号码
国内手机号码都是11位,比如18812345678
。我们一步步来写:
- 第1位肯定是1
^1
- 第2位一般是
34578
之一
[34578]
- 后面是9个数字
[0-9]{9}$
- 结合起来就是:
^1[34578][0-9]{9}$
简写为:
^1[34578]\d{9}$
我们可以这样测试:
aa = /^1[34578][0-9]{9}$/
aa.test(12812345678) //false
aa.test(138123456781) //false
aa.test(13812345678) //true
# 电子邮件
- 开始是长度在
1-10
的英文字母或数字,最后跟一个@
^[a-zA-Z0-9]{1,10}@
@
后面是长度为1-10
的英文字母
[a-zA-Z]{1,10}\.
- 后面跟一个
.
。因为.
在正则中是个关键字,表示任意字符,所以需要转义下:
\.
- 以
com
或org
结束
(com|org)$
- 结合起来就是:
^[a-zA-Z0-9]{1,10}@[a-zA-Z]{1,10}\.(com|org)$
# 日期
比如日期为:2020.03.04
- 年份允许0到2099。
# 先0-999
[1-9]?[1-9]?[0-9]
# 1000-1999
1[0-9]{3}
# 2000-2099
20[0-9]{2}
# 合起来
[1-9]?[1-9]?[0-9]|1[0-9]{3}|20[0-9]{2}
- 月份
[1-9]|0[1-9]|1[0-2]
- 日期
[1-9]|[0-2][0-9]|3[0-1]
- 结合起来就是:
^([1-9]?[1-9]?[0-9]|1[0-9]{3}|20[0-9]{2})\.([1-9]|0[1-9]|1[0-2])\.([1-9]|[0-2][0-9]|3[0-1])$
问题
这里并没有考虑2月只有28天这样的情况。最合理是在拆分3种长度的月份,以及闰年,那就复杂的多了。
# 网址
- 先是
http
或https
,再加://www.
^http[s]?:\/\/www\.
- 域名是长度在1-15的英文或数字
[a-zA-Z0-9]{1,15}
- 以
.com
或.org
结尾
\.(com|org)$
- 结合起来就是:
^http[s]?:\/\/www\.[a-zA-Z0-9]{1,15}\.(com|org)$
# 前缀后缀匹配
(?<=
可用来匹配文本的前缀
(?=
可用来匹配文本的后缀
例:
var str = `<kiss-font name="abc" />
<kiss-font :aa="ffs" name="bcd" />
`;
var reg = /(?<=(name="))\w+(?=("))/g
var arr = str.match(reg);
console.log(arr); //可以匹配出[‘abc', 'bcd']
TIP
可以使用这个网站 (opens new window)来校验正则