关于MAC地址
MAC地址,也就是网卡MAC码。网卡MAC码是由IEEE的注册管理机构固定分配的,因此每一个主机会有一个MAC地址,具有全球唯一性。
需求分析
因为业务需要验证MAC地址是否合法,因而想到用正则进行匹配。
看过了大神chenyufeng1991
的相关博客,有了一些大体思路。
原正则表达式为:
- ([A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2}
因为考虑到MAC地址一般有两种格式,使用-
连接或是:
连接,于是我稍作改动,改动结果如下
/((([a-f0-9]{2}:){5})|(([a-f0-9]{2}-){5}))[a-f0-9]{2}/gi
以上正则表达式就是最终版的MAC地址验证表达式,如果不清楚具体原理可以接着往下看。
拆解分析
1. [a-f0-9]
匹配a到f或0到9中的任意一位字符。
匹配的结果例如
2
或d
。
2. [a-f0-9]{2}
匹配连续两位的括号中任意字符。
匹配的结果例如
d2
或ac
。
3. [a-f0-9]{2}:
连续两位的括号中任意字符再拼接一个:
(冒号)。
匹配的结果例如
b2:
或23:
4. ([a-f0-9]{2}:)|([a-f0-9]{2}-)
在第三步的基础上可以将冒号替换为横杠。
匹配的结果例如
f3:
或79-
5. (([a-f0-9]{2}:)|([a-f0-9]{2}-)){5}
将第四步的结果重复5次。
匹配的结果例如
00-01-6C-06-A6-
或00:01:6C:06:A6:
6. (([a-f0-9]{2}:)|([a-f0-9]{2}-)){5}[a-f0-9]{2}
在第五步的结果上再拼接两个[A-F0-9]
范围内的两个字符
匹配的结果例如
00-01-6C-06-A6-29
或00:01:6C:06:A6:29
7. 设置大小写不敏感与全局匹配
在正则最后加上/ig
。
完整的正则表达式也就是:
/(([a-f0-9]{2}:)|([a-f0-9]{2}-)){5}[a-f0-9]{2}/gi
8.解决AA:BB-CC:DD:EE-FF
这类符号混用也能通过验证的问题
根据评论区smsra
大佬的提醒,第7步的正则无法剔除AA:BB-CC:DD:EE-FF
这类·-·与‘:’混用的脏数据,因此稍作改动,将重复匹配5次这一操作分别作用于
([a-f0-9]{2}:)
与([a-f0-9]{2}-)
。最终正则如下:
/((([a-f0-9]{2}:){5})|(([a-f0-9]{2}-){5}))[a-f0-9]{2}/gi