# 正则小结

# 介绍

# 3个重要的正则式命令

正则语法最重要的3个东西

  • 括号
    1. [] 内部是需要匹配的字符
    2. {} 内部是指定匹配字符的数量
    3. () 是用来分组的
  • 插入符号 ^ 表示开始
  • 美元符号 $ 表示结束

举个简单例子:

^([a-z]{1,2})([1-9]{2})$

我们一段一段分析:

  1. 掐头去尾只剩下中间部分:
([a-z]{1,2})([0-9]{2})
  1. 它是2个()组成的,先分析第1个
[a-z]{1,2}

其中,[]表示要求匹配从a到z之间的字母,{1,2}表示匹配1到2个字符。

  1. 第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
^1
  1. 第2位一般是34578之一
[34578]
  1. 后面是9个数字
[0-9]{9}$
  1. 结合起来就是:
^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. 开始是长度在1-10的英文字母或数字,最后跟一个@
^[a-zA-Z0-9]{1,10}@
  1. @后面是长度为1-10的英文字母
[a-zA-Z]{1,10}\.
  1. 后面跟一个.。因为.在正则中是个关键字,表示任意字符,所以需要转义下:
\.
  1. comorg结束
(com|org)$
  1. 结合起来就是:
^[a-zA-Z0-9]{1,10}@[a-zA-Z]{1,10}\.(com|org)$

# 日期

比如日期为:2020.03.04

  1. 年份允许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. 月份
[1-9]|0[1-9]|1[0-2]
  1. 日期
[1-9]|[0-2][0-9]|3[0-1]
  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种长度的月份,以及闰年,那就复杂的多了。

# 网址

  1. 先是httphttps,再加://www.
^http[s]?:\/\/www\.
  1. 域名是长度在1-15的英文或数字
[a-zA-Z0-9]{1,15}
  1. .com.org结尾
\.(com|org)$
  1. 结合起来就是:
^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)来校验正则

# 参考链接