常用正则表达式(手机号、邮箱、URL地址、身份证等等)
一、前言
不好的习惯:1、每一次用到正则都是上网copy一份,也没有去学习思考,看看都是什么意思;
2、一个项目里不同的地方用到了相同的校验,一直在重复的copy代码,并没有统一起来,万一哪天要修改规则,若是多人开发,每个人的正则校验不尽相同,改起来就很麻烦。
先记录一下,后续慢慢学习,最后自己能看懂并会写常用的正则。
二、正则基本知识点
1、横向模糊匹配{}:
一个正则可以匹配的字符串的长度不是固定的,使用量词可以达到这种目的。
量词:比如{m , n} :表示连续出现最少 m 次,最多 n 次;跟在一个字符的后面就表示对该字符的限定。
比如邮箱的校验:/^\[a-z0-9]+\.[a-z]{2,4}$/,写在了[a-z]后面,表示可以有2到4位的字母;
比如手机号的校验: /^1[3456789]\d{9}$/,跟在了\d后面,表示需要出现9个数字
{m , n} :表示连续出现最少 m 次,最多 n 次 {m , } :表示至少出现m次 {m} :表示出现m次 ? :等价于{0,1} 表示出现或不出现 + :等价于{1,} 表示至少出现1次 * :等价于{0,} 表示出现任意次,可以不出现
比如邮箱的校验:/^\[a-z0-9]+\.[a-z]{2,4}$/,写在了[a-z0-9]后面,可以出现0到9或者字母a-z的任意一个,至少一次
2、纵向模糊匹配[]:
正则匹配的字符串对于某一位置上的字符来说,它可以有多种可能,不局限于某一类型,使用字符组可以达到这种目的。
字符组:比如[abc],表示该字符是可以字符 "a"、"b"、"c" 中的任何一个。对于这一位置来说,我们可以有3种可能性。
比如手机号的校验: /^1[3456789]\d{9}$/,它在第二个位置,根据一般手机运营商来说,提供手机第二位的数字可以是3到9的任意一个,才符合规范。
如果字符组里表示的字符特别多,可以使用范围表示法,用连字符-来省略和缩写。
比如邮箱的校验:/^\[a-z0-9]+\.[a-z]{2,4}$/,它跟在@后面,根据我们邮箱的规范可知,@后面需要的是0到9或者字母a-z的任意一个
3、常用的简写形式
\d :表示[0-9],表示一位数字 \D :表示[^0-9],表示除数字外的任意字符 \w :表示[0-9a-zA-Z_],表示数字、大小写字母和下划线 \W :表示[^0-9a-zA-Z_],非单词字符
比如手机号的校验: /^1[3456789]\d{9}$/,结合后面的量词,\d在第三位,表示从第三位起,一共9位都是数字
三、表单常用
可以把一个项目里用到的校验规则写在一个工具类里,这样可以保证一个项目里对同一个东西的校验是统一的,不用重复多余的堆砌代码。
class Validator { //身份证校验 idCard(val){ return /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{7}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/.test(val) } //手机号校验 phnoe(val){ return /^1[3456789]\d{9}$/.test(val) } //邮箱 email(val){ return /^\[a-z0-9]+\.[a-z]{2,4}$/.test(val) } //普通护照 passport(val){ return /^((1[45]\d{7})|(G\d{8})|(P\d{7})|(S\d{7,8}))?$/.test(val) } //台胞证 taiwanID(val){ return /^[a-zA-Z][0-9]{9}$/.test(val) } //港澳身份证 hkId(val){ return /^([A-Z]\d{6,10}(\w1)?)$/.test(val) } //中文 chineseWord(val){ return /^[\u4e00-\u9fa5]*$/.test(val) } //密码(不能是纯数字或字母) psdRxp(val){ const numberRegexp = /^\d+$/; const letterRegexp = /^[a-zA-Z]+$/; return numberRegexp.test(val) || letterRegexp.test(val) } } export default new Validator();
参考书目:《javascript正则表达式迷你书》