正则表达式有多强大一看便知!

正则表达式并不难,只是很多人用得少所以记不住,但并不能否认它的强大之处!

正则表达式的作用

  1. 校验字符串文本是否符合规则

  2. 提取符合规则的文本内容

  3. 替换文本内容

正则的字符含义

字符 描述
. 匹配除换行符外的任意字符,一个点只能匹配一个
\w 匹配字母数字下划线或者汉字
\W 匹配任意不是字母,数字,下划线,汉字的字符
\s 匹配空白字符,它和[ \t\n\r]等价(分别是空格制表符换行符回车符)
\S 匹配任意不是空白符的字符
\d 匹配数字(只能表示一位数字,可以替换为[0-9])
\D 匹配任意非数字的字符
\b 匹配单词的开始或结束
\B 匹配不是单词开头或结束的位置
^ 匹配字符串的开始,在列举的上面表示非,如[^\d]
a-Z 匹配a-Z之间的任意字符
$ 匹配字符串的结束
* 重复零次或多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
() 表示分组,就是括号里面的作为一个整体
[] 表示字符串的列举

相关方法

test()

  • 用于检测字符串是否符合正则规定

let str = 'javascript'
let reg = /java/
// 检测字符串是否包含'java'
console.log(reg.test(str)); //true

match()

  • match()可以检索一个字符串或者一个正则的匹配,并将匹配到的结果通过数组返回,如果未加全局匹配,则只能通过数组返回匹配到的第一项结果,并会附加信息

var str="1 plus 2 equal 3"
console.log(str.match('equal')); //[ 'equal', index: 9, input: '1 plus 2 equal 3', groups: undefined ]
console.log(str.match(/\d+/)); //[ '1', index: 0, input: '1 plus 2 equal 3', groups: undefined ]
console.log(str.match(/\d+/g)); //[ '1', '2', '3' ]

replace()

  • replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串

  • stringObject.replace(regexp/substr,replacement)

    • 参数一为要替换的子字符串或要替换的模式的正则对象

    • 规定了替换文本或生成替换文本的函数

var str="Visit Microsoft!"
console.log(str.replace('Microsoft', "W3School")); //Visit W3School!
console.log(str.replace(/Microsoft/, "W3School")); //Visit W3School!

exec()

  • exec() 方法用于检索字符串中的正则表达式的匹配

  • 通过exec()匹配到的每一项有效结果都会附加信息

  • 在都是非全局匹配的模式下,exec()返回的结果与match()相同;如果是全局匹配,exec()每被调用一次都会返回一项结果数组,直到无法匹配到内容时停下,返回null

let str="1 plus 2 equal 3"
let reg = /\d/g
console.log(reg.exec(str)); //[ '1', index: 0, input: '1 plus 2 equal 3', groups: undefined ]
console.log(reg.exec(str)); //[ '2', index: 7, input: '1 plus 2 equal 3', groups: undefined ]
console.log(reg.exec(str)); //[ '3', index: 15, input: '1 plus 2 equal 3', groups: undefined ]
console.log(reg.exec(str)); //null

应用实例

检测手机号

  • 11位数

  • 第1位为1,第2位在(3,4,5,6,7,8,9)中选1位,3~11位为数字即可

function isPhoneNumber(tel) {var reg =/^1[3-9]\d{9}$/;return reg.test(tel);
}
isPhoneNumber('13997584510')

检测邮箱

  • 以@为分隔符,在@之前以字母、数字开头,之后还可以跟随减号(-)或小数点(.),但不能同时跟随

  • @之后必须紧跟字母或数字

  • 在此之后应紧跟至少一个特殊字符小数点(.)或减号(-),减号(-)可有可无,但是小数点(.)必须存在,并且以小数点后结尾,两种特殊字符也可以共存。不管是小数点(.)还是减号(-),后面都要求跟字母或数字

function isEmail(str){var reg = /^[A-Za-z0-9]+[-\.]*@[A-Za-z0-9]+(-[A-Za-z0-9])*\.[A-Za-z0-9]+$/;return reg.test(str);
}
isEmail('2270877057@qq.com')

邮箱由于格式种类众多,因此想用一个正则能够检测出所有的邮箱使不现实的,这使得邮箱的检测必定不会完美

检测密码强度

  • 按照密码强度标准,根据打分机制评定密码强度

  • 长度(25分)

    • 5 分: 小于等于 4 个字符

    • 10 分: 5 到 7 字符

    • 25 分: 大于等于 8 个字符

  • 字母组成(25分)

    • 0 分: 没有字母

    • 10 分: 包含字母但全都是小(大)写字母

    • 25 分: 包含大小写混合字母

  • 数字组成(20分)

    • 0 分: 没有数字

    • 10 分: 1或2个数字

    • 20 分: 大于 2 个数字

  • 其它特殊符号(@#$%^&*)(25分)

    • 0 分: 没有符号

    • 10 分: 1 个符号

    • 25 分: 大于 1 个符号

  • 额外奖励(5分)

    • 2 分: 字母和数字

    • 3 分: 字母、数字和符号

    • 5 分: 大小写字母、数字和符号

  • 最后评分标准:

    分数 等级
    >=90 非常安全
    >=80 安全
    >=70 非常强
    >=60
    >=50 一般
    >=25
    >=0 非常弱
  • 由于检测规则较为复杂,因此借用了方法判断

// 获取总分数
function getTotalScore(password) {let totalScore = 0const regLowLetter = /[a-z]+/gconst regUpLetter = /[A-Z]+/gconst regAllLetter = /([a-z]+[A-Z]+)|([A-Z]+[a-z]+)/gconst regSpecialChar = /[@#$%^&*]+/gconst specialCharNum = password.match(regSpecialChar) ? password.match(regSpecialChar)[0].length : 0const regNumber = /\d*/gconst numberLen = password.length - password.replace(regNumber, '').lengthconst extral2 = /^(?=.*[a-zA-Z])(?=.*\d).*$/const extral3 = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@#$%^&*]).*$/const extral5 = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&*]).*$/// 检测字符长度if (password.length >= 8) {totalScore += 25} else if (5 <= password.length) {totalScore += 10} else {totalScore += 5}// 检测字母if (regAllLetter.test(password)) {totalScore += 25} else if (regLowLetter.test(password) || regUpLetter.test(password)) {totalScore += 10} else {totalScore += 0}// 检测数字if (numberLen >= 3) {totalScore += 20} else if (0 < numberLen) {totalScore += 10} else {totalScore += 0}// 检测其他字符if (specialCharNum == 1) {totalScore += 10} else if (specialCharNum > 1) {totalScore += 25} else {totalScore += 0}// 额外奖励if (extral5.test(password)) {totalScore += 5} else if (extral3.test(password)) {totalScore += 3} else if (extral2.test(password)) {totalScore += 2} else {totalScore += 0}return totalScore
}
// 获取级别
function getRank(password) {let totalScore = getTotalScore(password)switch (true) {case totalScore >= 90:console.log('密码非常安全');break;case totalScore >= 80:console.log('密码安全');break;case totalScore >= 70:console.log('密码非常强');break;case totalScore >= 60:console.log('密码强');break;case totalScore >= 50:console.log('密码一般');break;case totalScore >= 25:console.log('密码弱');break;case totalScore >= 0:console.log('密码非常弱');break;}
}
getRank('ahhi1233217890#0')

替换文本

  • 以替换首尾空格为例,模拟trim()方法

function replaceText(text) {var reg = /^\s*|\s*$/;return text.replace(reg, '')
}
replaceText('                        Jfsd4324--_ ');

提取文本

  • 将windows后面跟着的版本号一起提取出来

let text = 'Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.Windows 95 and Windows 98 are the successor.Then Windows 2000 and Windows Xp appeared.Windows Vista is the Latest version of the family.'function extractTetx(text) {let reg = /Windows ([\d.]|[a-zA-Z])+\b/greturn text.match(reg)
}
console.log(extractTetx(text));

检测身份证

  • 身份证的规则:

    • 15位:ai = xxxxxx yymmdd aa g

    • 18位:ai = xxxxxx yyyymmdd aa g p

    1. x 是6位是地区编码,地区编码首位不能为0

    2. ymd 分别表示年月日,表示出生日期,aa 是随机码,g是性别,p是校验码

  • 校验码计算规则:

    • 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]

    • 验证位 tt = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]

    • 校验码 p = tt[i],其中 ,i是公式除11后取得的余数,如2.31则 i=3,2.37 则 i =4

  • 由于检测规则较为复杂,因此借用了方法判断

// 判断是否是身份证的核心方法
function isIDCard(str) {let getBirthday// 获取身份证最后一位数,用于核对校验码let getLastNum = str.slice(-1, )if (str.length == 15) {getBirthday = str.slice(6, 12)// 出生日期核对(15位身份证无校验码)if (!(birthRule(getBirthday))) {return false}} else {getBirthday = str.slice(6, 14)// 校验码与生出日期核对if (!(birthRule(getBirthday) && countLastNum(str) == getLastNum)) {return false}}// 正则核对let reg = /(^[1-9]\d{13}(\d{3}[Xx]|\d{4})$)|(^[1-9]\d{11}(\d{3}[Xx]|\d{4})$)/;return reg.test(str);
}
// 判断生日是否合法(string:birthday)
function birthRule(birthday) {let year = birthday.slice(0, -4)let month = birthday.slice(-4, -2)let day = birthday.slice(-2, )if (year.length === 2) {year = '19' + year}if (year > new Date().getFullYear() || month > 12) {return false}let days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]// 闰年if ((year % 100 !== 0 && year % 4 === 0) || year % 400 === 0) {days[1] = 29}if (day > days[month - 1]) {return false}return true
}
// 计算校验码(即使用上述公式)
function countLastNum(idCard) {let tt = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]let wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]let arr1 = []let totalNum = 0let arr2 = idCard.slice(0, 17).split('')arr2.forEach((item, i) => {arr1.push(parseInt(item) * wi[i])});totalNum = arr1.reduce((total, value) => total + value)return tt[mod(totalNum, 11)] - 1
}
// 取余函数
function mod(den, mol) {return parseInt((den / mol).toFixed(1).toString().split('.')[1])
}
console.log(isIDCard('422301196912307153'));

检测QQ号

  • qq号的规则非常简单:

    1. 5~11位数

    2. 首位不能为0

function isQQ(qq) {var reg = /^[1-9]\d{4,10}$/;return reg.test(qq);
}
console.log(isQQ('13997584510'));

检测微信号

  • 必须以字母开头,可以使用6-20位字母、数字、下划线或减号(-)组合。

  • 不能设置中文

function isWeiXin(weiXin) {var reg = /^[a-zA-Z][a-zA-Z0-9_-]{5,19}$/;return reg.test(weiXin);
}
console.log(isWeiXin('J13997584510'));

正则表达式有多强大一看便知!相关推荐

  1. java判断南北纬度的分界线_中国地理之南北分界线标志园,就在江苏淮安,是南是北一看便知...

    原标题:中国地理之南北分界线标志园,就在江苏淮安,是南是北一看便知 导语:中国地理之南北分界线标志园,就在江苏淮安,是南是北一看便知 在中国有几百个城市,有些城市名气大,而有些城市默默无闻,但是都各有 ...

  2. 小米手机电池测试软件哪个比较好,小米的电池测试信息量很大,哪种手机续航能力强一看便知...

    原标题:小米的电池测试信息量很大,哪种手机续航能力强一看便知 对于手机来说,其很多功能都有着很大的提升空间,比如拍照,屏幕,续航,性能,而厂商们不得不做出取舍,因为无法在小小的机身中实现所有诉求. 比 ...

  3. TVS二极管选型与参数,一看便知

    最近发现,有不少的访客在线咨询东沃电子: 1)请问贵公司有击穿电压400V,额定峰值电流3KA的瞬态抑制二极管吗?型号是哪个? 2)产品电路工作电压3.6V,需要一个TVS管来防护,应该选择你们的哪产 ...

  4. 程序员专不专业,这些词汇拼写一看便知!

    很多程序员花了太多的时间在自己的技术水平提升,却不曾注意注意到哪些常用词汇的书写,导致给别人留下不够严谨的印象而不自知. 下面学姐整理出来一些常用错的技术词汇&常用英语词汇,方便大家在求职或者 ...

  5. html5蚂蚁森林种树效果,蚂蚁森林种树有什么用(隐形好处一看便知)

    任何人都不会平白无故的做一件毫无意义的事,每一件事在做之前都会有自己的最终目的,因为我们想从中获得开心,认同感,物质,幸福等等. 种树是近年来比较流行的一种环保方式,越来越多的人加入其中,并且乐不思蜀 ...

  6. hofstede六个维度指数指标_五张图表 一看便知50指数基金如何选?

    来自养基笔记的雪球原创专栏 摘要:本文主要分析了三大50指数因编制规则不同而导致的成分股差异,由此导致在白马行情.牛市初期.金融降杠杆等不同时期,各50指数的不同收益表现.希望能帮助投资者挑出自己喜欢 ...

  7. tensorflow中random_normal的使用,案例说明,一看便知

    先说明函数: tf.random_normal tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, n ...

  8. 超级全的解释#define宏——简洁明了,一看便知

    全面解释#define宏 宏是在预处理阶段的一种文本替换工具. 一.符号常量:#define 一种最简单的宏的形式如下: #define 宏名 替换文本 1  2  3  4  5  6  7  8 ...

  9. 2021年东华高级中学高考成绩查询,东莞市最好的三所高中,成绩一看便知,你知道几所...

    东莞是岭南文化的重要发源地,中国近代史的开篇地和改革开放的先行地,全国4个不设区的地级市之一,在2018年"中国外贸百强城市"排名中,东莞排名第三.该地基础教育极为发达,本地户籍适 ...

  10. PHP就业前景好不好一看便知,转行选择需谨慎!

    随着互联网行业迎来新一波的热潮,更多的年轻人选择软件行业发展.由于互联网本身快速发展.不断创新的特点,决定了只有以快开发速度和低成本,才能赢得胜利,才能始终保持网站的领先性和吸引更多的网民. 互联网的 ...

最新文章

  1. ubuntu 12.04 添加 IP并配置DNS
  2. SQL Server 2005之PIVOT/UNPIVOT行列转换
  3. 2021年全新各方向IT职业技能图谱
  4. SVM 透彻理解与分析
  5. 【Java】Struts2配置默认Action和配置Action的默认处理类
  6. Java限流之 —— Nginx限流
  7. 监听自身卸载,弹出用户反馈调查
  8. Android广播机制(1)
  9. 13-[LVI-SAM]visual_odometry_初探
  10. C++封装Detours库挂钩函数
  11. html唱片机效果,黑胶唱片风格音频播放器jQuery插件
  12. 谈的话马上得到了聚众传媒创始人虞峰、博客中国创始人方兴东及携程网创始人之一的季琦等三位嘉宾的一致响应
  13. c语言中compar的用法,compare的用法
  14. MQTT-java使用说明
  15. 2021年安全员-C证(江西省)考试报名及安全员-C证(江西省)证考试
  16. bootstrap实战--微金所项目(导航栏)
  17. textarea 中的换行、空格; 如何处理
  18. 小程序直播间点赞向上随机飘动画
  19. eMMC(KLM8G2FE3B)
  20. NS2 教學手冊 ( NS2 Learning Guide)

热门文章

  1. .fai 文件格式解读
  2. 什么是OBD及组成和作用、工作原理
  3. 关于KNX/IP 网关协议报文解析以及几个注意事项
  4. Iphone的Wallet中如何移除电子登机牌凭证
  5. 计算机工程好发论文么,计算机工程期刊发表论文有什么要求
  6. OPENWRT-LUCI开发总结-LUCI添加新页面总结
  7. Codeforces Round #687 (Div. 2) C. Bouncing Ball(枚举 思维)
  8. Windows电脑上搭建Radius 服务器并实现802.1X认证
  9. “刀片嗓”“水泥鼻”“咳出肺”可以这样缓解!
  10. 《天长地久》写照真实生活为何被影迷埋没不被欣赏