• 正则表达式是一个规则,用于验证字符串。

基础

1. 特殊字符

  1. . 匹配除换行符 \n 之外的任何单字符
  2. ^ 匹配输入字符串的开始位置
  3. $ 匹配输入字符串的结尾位置

2.转义符

  1. \n 匹配一个换行符
  2. \r 匹配一个回车符
  3. \t 匹配一个制表符
  4. \s 匹配任何空白字符,包括空格、制表符、换页符等等
  5. \S 匹配任何非空白符
  6. \b 匹配一个单词边界,即字与空格间的位置
  7. \B 匹配一个非单词边界
  8. \d 匹配一个数字字符。等价于 [0-9]。
  9. \D 匹配一个非数字字符
  10. \w 匹配字母、数字、下划线
  11. \W 匹配非字母、数字、下划线
  12. \un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符
  • 转义符可以将特殊字符转义

3.字符集

  1. [字符范围]

匹配中文: [\u4e00-\u9FA5]

4. 量词

前面的规则出现的次数

  1. * 匹配前面的子表达式零次或多次
  2. + 匹配前面的子表达式一次或多次
  3. ? 匹配前面的子表达式零次或一次
  4. {n}: 匹配n
  5. {n,}: 匹配>=n
  6. {n,m}: 匹配n-m

应用

  • 正则表达式表现为一个对象,该对象是通过构造函数RegExp

创建正则对象

  1. 字面量模式
  2. 构造函数模式
  1. var reg = /\d+?/ //字面量模式
  2. new RegExp(/ab+c/, 'i'); //构造函数模式

正则实例成员

  • global 是否开启全局搜索
  • ignoreCase 是否开启忽略大小写
  • multiline 是否开启多行
  • source 返回正则文本
  • test方法:验证某个字符串是否满足规则
  • exec方法:execute,执行匹配,得到匹配结果。
  1. var reg = /\d+/g;
  2. var s = "1234abc123aaa";
  3. //得到所有的匹配结果和位置
  4. while (result = reg.exec(s)) {
  5. console.log(`匹配结果:${result[0]},出现位置:${result.index}`);
  6. }
  7. console.log(reg.test(s));
  8. console.log(reg.source); // /\d+/g

正则表达式,默认情况下,适用贪婪模式
在量词后,加上?,表示进入非贪婪模式

具体查找

字符串对象中的正则方法

  • split 字符串分割,可以传入正则
  • replace 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串
  • search 方法执行正则表达式和 String 对象之间的一个搜索匹配
  • match 方法检索返回一个字符串匹配正则表达式的结果
  1. var s = "hello world\tjavascript\nyes";
  2. //将空白字符替换为逗号
  3. console.log(s);
  4. s = s.replace(/\s*\b[a-z]\s*/g, function(match){
  5. return match.toUpperCase().trim();
  6. });
  7. console.log(s);
  8. //按照逗号、空格、横杠、制表符进行分割
  9. // var result = s.split(/[, \-\s]/);
  10. // console.log(s, result);
  11. // var result = s.match(/\d+/)
  12. // console.log(s, result);
  13. // var result = s.search(/\d+/g)
  14. // console.log(s, result);
  15. // result = s.search(/\d+/g)
  16. // console.log(s, result);

具体查找

  1. //练习
  2. // 1. 书写一个正则表达式,去匹配一个字符串,得到匹配的次数,和匹配的结果
  3. var reg = /\d{2}/gi;
  4. var str = "1123rsf434weasf4214asfr234qdas34";
  5. var n = 0;
  6. while(result = reg.exec(str)){
  7. n ++;
  8. console.log(result[0]);
  9. };
  10. console.log(`总共匹配${n}次`); // 8
  11. // 2.得到一个字符串中中文字符的数量
  12. var reg1 = /[\u4e00-\u9fa5]/g;
  13. var str1= "大锅饭开始的每个快递adfgsfa公司法";
  14. var n2 = 0;
  15. while(reg1.test(str1)){
  16. n2 ++;
  17. };
  18. console.log(n2); // 13
  19. //过滤敏感词汇
  20. var arr = ['敏','感','词','zz','lj'];
  21. var str = '过滤敏感423企鹅23442342ljfsdfzzfasfsf词';
  22. function filterC(str,seq){
  23. var reg = new RegExp(`(${arr.join('|')})+`,'g'); //开启贪婪匹配模式
  24. return str.replace(reg,seq);
  25. };
  26. console.log(filterC(str,'****'));
  27. //'过滤****423企鹅23442342****fsdf****fasfsf****'

进阶

捕获组

用小括号包裹的部分叫做捕获组,捕获组会出现在匹配结果中

捕获组可以命名,叫做具名捕获组

非捕获组 在小括号里面的开始加上?:

  1. //捕获组
  2. var reg = /(\d[a-z])([a-z]+)/g;
  3. var s = "2afsdf-5fdgdfg-9asddf";
  4. while (result = reg.exec(s)) {
  5. console.log(result);
  6. };
  7. var dateStr = "1999-1-10,2000-11-22,2202-11-11";
  8. //得到每一个日期,并得到每个日期的年月日
  9. var reg = /(?<year>\d{4})-(?<mouth>\d{1,2})-(?<day>\d{1,2})/g;
  10. while (result = reg.exec(dateStr)) {
  11. console.log("捕获到的年份:" + result.groups.year);
  12. console.log("捕获到的月份:" + result.groups.mouth);
  13. console.log("捕获到的日期:" + result.groups.day);
  14. }

反向引用

在正则表达式中,使用某个捕获组,\捕获组编号

  1. var s = "aaaaaaaabbbbbbbbbccccccdefgggggggg";
  2. //找出该字符串中连续的字符
  3. var reg = /(\w)\1+/g;
  4. while (result = reg.exec(s)) {
  5. console.log(result[1]);
  6. }

正向断言(预查)

检查某个字符后面的字符是否满足某个规则,该规则不成为匹配结果,并且不称为捕获组

  1. //匹配 数字前面的字母
  2. var s = "sdfsdf3434343sdfsa545454dfsdfsfsd6754";
  3. var reg = /[a-zA-Z](?=\d+)/g; // (?=\d+) 正向断言(预查)
  4. while (result = reg.exec(s)) {
  5. console.log(result);
  6. }
  7. // var s = "334353456"; //数字按照金额排列,由后面数起,每三位一个,
  8. // var reg = /\B(?=(\d{3})+$)/g;
  9. // s = s.replace(reg, ",");
  10. // console.log(s);

负向断言(预查)

检查某个字符后面的字符是否不满足某个规则,该规则不成为匹配结果,并且不称为捕获组

  1. // 返回的是某个字母后面不是数字相连的字母
  2. var s = "afg43223444wr423424243";
  3. var reg = /[a-zA-Z](?!\d+)/g; // (?!\d+) 负向断言(预查)
  4. while (result = reg.exec(s)) {
  5. console.log(result); //a f w
  6. }
  1. //练习
  2. // 判断密码强度
  3. // 密码长度必须是6-12位
  4. // 出现小写字母、大写字母、数字、特殊字符(!@#_,.) -> 强
  5. // 出现小写字母、大写字母、数字 -> 中
  6. // 出现小写字母、大写字母 -> 轻
  7. // 其他 -> 不满足要求
  8. function filterPwd(pwd){
  9. if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#_,.]).{6,12}$/.test(pwd)){
  10. return '强'
  11. }else if(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,12}$/.test(pwd)){
  12. return '中'
  13. }else if(/^(?=.*[a-z])(?=.*\d).{6,12}$/.test(pwd)){
  14. return '轻'
  15. }else {
  16. return '不满足要求'
  17. }
  18. };
  19. console.log(filterPwd('3453fsdfsdgad'));