- 正则表达式是一个规则,用于验证字符串。
基础
1. 特殊字符
. 匹配除换行符 \n 之外的任何单字符^ 匹配输入字符串的开始位置$ 匹配输入字符串的结尾位置
2.转义符
\n 匹配一个换行符\r 匹配一个回车符\t 匹配一个制表符\s 匹配任何空白字符,包括空格、制表符、换页符等等\S 匹配任何非空白符\b 匹配一个单词边界,即字与空格间的位置\B 匹配一个非单词边界\d 匹配一个数字字符。等价于 [0-9]。\D 匹配一个非数字字符\w 匹配字母、数字、下划线\W 匹配非字母、数字、下划线\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符
- 转义符可以将特殊字符转义
3.字符集
[字符范围]
匹配中文: [\u4e00-\u9FA5]
4. 量词
前面的规则出现的次数
* 匹配前面的子表达式零次或多次+ 匹配前面的子表达式一次或多次? 匹配前面的子表达式零次或一次{n}: 匹配n个{n,}: 匹配>=n个{n,m}: 匹配n-m个
应用
- 正则表达式表现为一个对象,该对象是通过构造函数RegExp
创建正则对象
- 字面量模式
- 构造函数模式
var reg = /\d+?/ //字面量模式new RegExp(/ab+c/, 'i'); //构造函数模式
正则实例成员
- global 是否开启全局搜索
- ignoreCase 是否开启忽略大小写
- multiline 是否开启多行
- source 返回正则文本
- test方法:验证某个字符串是否满足规则
- exec方法:execute,执行匹配,得到匹配结果。
var reg = /\d+/g;var s = "1234abc123aaa";//得到所有的匹配结果和位置while (result = reg.exec(s)) {console.log(`匹配结果:${result[0]},出现位置:${result.index}`);}console.log(reg.test(s));console.log(reg.source); // /\d+/g
正则表达式,默认情况下,适用贪婪模式
在量词后,加上?,表示进入非贪婪模式
字符串对象中的正则方法
- split 字符串分割,可以传入正则
- replace 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串
- search 方法执行正则表达式和 String 对象之间的一个搜索匹配
- match 方法检索返回一个字符串匹配正则表达式的结果
var s = "hello world\tjavascript\nyes";//将空白字符替换为逗号console.log(s);s = s.replace(/\s*\b[a-z]\s*/g, function(match){return match.toUpperCase().trim();});console.log(s);//按照逗号、空格、横杠、制表符进行分割// var result = s.split(/[, \-\s]/);// console.log(s, result);// var result = s.match(/\d+/)// console.log(s, result);// var result = s.search(/\d+/g)// console.log(s, result);// result = s.search(/\d+/g)// console.log(s, result);
//练习// 1. 书写一个正则表达式,去匹配一个字符串,得到匹配的次数,和匹配的结果var reg = /\d{2}/gi;var str = "1123rsf434weasf4214asfr234qdas34";var n = 0;while(result = reg.exec(str)){n ++;console.log(result[0]);};console.log(`总共匹配${n}次`); // 8// 2.得到一个字符串中中文字符的数量var reg1 = /[\u4e00-\u9fa5]/g;var str1= "大锅饭开始的每个快递adfgsfa公司法";var n2 = 0;while(reg1.test(str1)){n2 ++;};console.log(n2); // 13//过滤敏感词汇var arr = ['敏','感','词','zz','lj'];var str = '过滤敏感423企鹅23442342ljfsdfzzfasfsf词';function filterC(str,seq){var reg = new RegExp(`(${arr.join('|')})+`,'g'); //开启贪婪匹配模式return str.replace(reg,seq);};console.log(filterC(str,'****'));//'过滤****423企鹅23442342****fsdf****fasfsf****'
进阶
捕获组
用小括号包裹的部分叫做捕获组,捕获组会出现在匹配结果中
捕获组可以命名,叫做具名捕获组
非捕获组 在小括号里面的开始加上?:
//捕获组var reg = /(\d[a-z])([a-z]+)/g;var s = "2afsdf-5fdgdfg-9asddf";while (result = reg.exec(s)) {console.log(result);};var dateStr = "1999-1-10,2000-11-22,2202-11-11";//得到每一个日期,并得到每个日期的年月日var reg = /(?<year>\d{4})-(?<mouth>\d{1,2})-(?<day>\d{1,2})/g;while (result = reg.exec(dateStr)) {console.log("捕获到的年份:" + result.groups.year);console.log("捕获到的月份:" + result.groups.mouth);console.log("捕获到的日期:" + result.groups.day);}
反向引用
在正则表达式中,使用某个捕获组,\捕获组编号
var s = "aaaaaaaabbbbbbbbbccccccdefgggggggg";//找出该字符串中连续的字符var reg = /(\w)\1+/g;while (result = reg.exec(s)) {console.log(result[1]);}
正向断言(预查)
检查某个字符后面的字符是否满足某个规则,该规则不成为匹配结果,并且不称为捕获组
//匹配 数字前面的字母var s = "sdfsdf3434343sdfsa545454dfsdfsfsd6754";var reg = /[a-zA-Z](?=\d+)/g; // (?=\d+) 正向断言(预查)while (result = reg.exec(s)) {console.log(result);}// var s = "334353456"; //数字按照金额排列,由后面数起,每三位一个,// var reg = /\B(?=(\d{3})+$)/g;// s = s.replace(reg, ",");// console.log(s);
负向断言(预查)
检查某个字符后面的字符是否不满足某个规则,该规则不成为匹配结果,并且不称为捕获组
// 返回的是某个字母后面不是数字相连的字母var s = "afg43223444wr423424243";var reg = /[a-zA-Z](?!\d+)/g; // (?!\d+) 负向断言(预查)while (result = reg.exec(s)) {console.log(result); //a f w}
//练习// 判断密码强度// 密码长度必须是6-12位// 出现小写字母、大写字母、数字、特殊字符(!@#_,.) -> 强// 出现小写字母、大写字母、数字 -> 中// 出现小写字母、大写字母 -> 轻// 其他 -> 不满足要求function filterPwd(pwd){if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#_,.]).{6,12}$/.test(pwd)){return '强'}else if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,12}$/.test(pwd)){return '中'}else if(/^(?=.*[a-z])(?=.*\d).{6,12}$/.test(pwd)){return '轻'}else {return '不满足要求'}};console.log(filterPwd('3453fsdfsdgad'));
