正则表达式

  1. **正则表达式:规定字符串中字符出现规律的公式
    何时:查找 替换(删除,格式化) 切割 验证
    如何定义正则表达式: (和js无关)

    1. 最简单的正则表达式:就是关键词的原文
    2. 字符集: 规定一位字符备选的字符列表
      [备选字符列表]
      强调:1个字符集,只能规定1位字符的规则
      且必须选一个
      如果备选字符列表中个别字符之间是连续的,可用-省略中间的字符。比如: 1位数字: [0-9]
      1位小写字母:[a-z]
      1位大写字母:[A-Z]
      匹配1位字母:[a-zA-Z]
      1位汉字:[\u4e00-\u9fa5]
      字符集开头,使用^表示除了xx
      但除xx外一切字符都行!范围太大了。
    3. 预定义字符集: 对常用字符集的简化标识
      \d -> [0-9] 一位数字

      \w -> [0-9A-Za-z_] 一位字母,数字或下划线

      \s -> 换行,空格,tab 一位空字符

      . -> 除回车换行外,任意一个字符

      [^,]除逗号外的任意字符

      问题: 字符集是固定的
      解决:如果要定义的字符集和预定义字符集不符
      就要手写普通字符集

    4. 量词:规定字符集出现次数的规则
      如何使用:用于字符集之后,
      默认修饰相邻的前一个字符集
      有明确数量的量词:
      {m,n} 最少m次,最多n次
      {m,} 最少m次,多了不限
      {m} 必须m次
      没有明确数量的量词:
      ? 可有可无,最多1次
      * 可有可无,多了不限
      + 至少一次,多了不限
    5. 分组和选择:
      选择:或 正则1|正则2 只要满足任意一个正则即可
      分组:() ()扩起的子表达式称为一组
      数量词放在()之后,则修改一组出现的次数

      *分组编号: 正则中每个(),对会自动生成从1开始的编号。如果后边想匹配和前边某个分组完全相同的内容,可用\n匹配。
      比如: 111122233333445555666
      和第一个字符完全相同的一组重复字符
      (.)\1*
      比如: a,,a,,b,,c,,c,,c,,d,,d
      匹配相同的多个字母及其逗号
      (^|,)([^,]*)(,,\2)+(,|$)

      身份证号: 15位数字
      2位数字
      最后1位,可能在数字,X,x中选一个
      后三位一组,可有可无,最多一次
      \d{15}(\d{2}[0-9Xx])?

      正则中如果正文和正则保留字冲突,也可用\转义

      手机号: +86或0086 可有可无,最多1次
      空字符 可有可无,多了不限
      1
      [34578]
      9位数字
      (\+86|0086)?\s*1[34578]\d{9}

    6. 指定匹配位置:
      ^ 开始位置的 一般用于正则开头,匹配开始位置的x
      以xxx开头的
      $ 结束位置前的x 一般用于正则结尾
      以xxx结尾的

比如: ^\s+ 匹配开头位置的多个空字符
     \s+$ 匹配结尾位置前的多个空字符
    ^\s+|\s+$ 匹配开头或结尾的空字符    
     前加^,后加$ 从头到尾完整匹配 - 验证

     单词边界: \b 一个单词开头或结尾的空字符

  7. 预判: 提前检查整个字符串是否符合个别要求
           正则中的"而且"
  比如: 密码强度要求:
    至少包含一位大写字母
    至少包含一位数字
    8位字符,必须是字母,数字的组合 [0-9a-zA-Z]{8}
  排除法:
    1. 判断从开头到结尾不全由小写字母和数字组成
       结论: 可能包含大写字母 或 特殊符号
      ` (?![0-9a-z]+$)`
    2. 判断从开头到结尾不全由字母组成(大写和小写)
       结论: 可能包含数字 或 特殊符号
       `(?![a-zA-Z]+$)`
    3. 只能由数字和字母组成(排除特殊符号): 
    `(?![0-9a-z]+$)(?![a-zA-Z]+$)[0-9a-zA-Z]{8}`
  1. ***String 正则API
    查找 替换(删除,格式化) 切割
  2. ****RegExp :查找 验证

  3. ***String 正则 API
    查: str.indexOf()

    1. 查找固定的一个关键词的位置,可指定开始位置
      var i=str.indexOf(“关键词”,fromi);
      返回fromi下一个关键词的位置下标
      var i=str.lastIndexOf(“关键词”,fromi)
      返回fromi前的上一个关键词的位置下标
      找不到返回-1
      问题: 不支持正则!
      何时使用: 只要查找固定关键词的位置
  4. 仅判断是否包含:
    str.search(/reg/)
    var i=str.search(/reg/)

    在str中查找第一个和reg匹配的关键词
    找到返回位置下标,没找到,返回-1
    强调: 不认后缀g
    问题:无法设置开始位置,也不支持g
    str.match(/reg/gi);

  5. 获得所有关键词的内容:
    var arr=str.match(/reg/gi);
    默认情况,只找第一个
    如果找全部:第二个/后加g
    如果忽略大小写: 第二个/后加i
    多数情况,可同时使用
    *返回值: 返回数组,包含所有匹配的关键词内容
    arr.length,获得找到关键词的个数
    如果没找到,返回null!
    所以,都要先判断不是null,才能继续访问!
    问题: 无法获得每个关键词的位置

    1. 即获得每个关键词的内容,又能获得每个次的位置:
      RegExp(待续)
      str.replace(/reg/gi,"替换内容");
      替换: 找到str中的和reg匹配的关键词,替换为新内容
      str=str.replace(/reg/gi,"替换内容");
      强调:无权修改原字符串,只能返回新字符串
      默认也只能替换第一个,加g后才能替换所有
      如需返回更新后的数组:解决方法为
      在定义的function内的结尾加return arr;
      //必须将新数组返回,外部才能获取到
      且在调用函数时arr=quchongfu(arr);//全局变量
      删除: 用replace方法将关键词替换为””
      其实js中的String对象已经定义了str=str.trim() IE9+

    格式化: 将正则表达式匹配的内容,替换为新的格式
    2步: 1. 用正则表达式将要格式化的字符串分组
    2. 在replace的第二个参数中使用$n代替分组匹配的内容,组成新格式。

    切割: var arr=str.split(/reg/);

    鄙视题:

    1. 统计字符串中每个字符出现的次数
      同: 找出字符串中出现次数最多的字符,共出现?次

    2. 去掉数组中重复的元素
      (^|,)([^,]+)(,,\2)+(,|$)

  6. ***RegExp对象

  7. ***RegExp对象: 封装一个正则表达式,提供用正则表达式进行验证和查找的方法。
    何时使用:1. 即找关键词内容,又找位置时
    2. 验证字符串格式
    如何创建: 2种

    1. 直接量: var reg=/正则/gi;
      何时使用: 创建固定的正则表达式时
      问题: 正则中出现正文/,要用\转义
      比如:切割: /<\/li>\s*<li>/
      1. 示例化对象: var reg=new RegExp("正则","gi")
        何时使用: 动态生成正则表达式
        问题: 正则中出现”或者\,都要用\转义
        比如: "\\d{6}"

    正则API: 2个

    1. 即查找关键词内容,又查找关键词位置:
      var arr=reg.exec(str);
      强调:如果查找全局,reg要加g
      执行过程:
      从str的开始位置,找下一个匹配的关键词
      将找到的一个关键词放入arr中第1个元素
      为arr添加index属性,标识当前关键词的位置
      如何使用:只要使用循环反复调用即可
      exec可自动修改RegExp对象的lastIndex属性
      RegExp的lastIndex属性定义了下次开始位置
      如果没找到,返回null

    贪婪模式: 正则表达式默认匹配最长的符合条件的子字符串
    懒惰模式: 让正则表达式仅匹配最短的符合条件的子字符串
    贪婪改懒惰: .* -> .*?
    .+ -> .+?

//匹配网页中的所有超链接a元素:
<a\s+[^>]*href=["|']([^'"]+)["|'][^>]*>.*?</a>

 var reg=new RegExp
("<a\\s+[^>]*href=[\"|\']([^\'\"]+)[\"|\'][^>]*>.*?</a>","gi")//$1

    var arr=null;
    //反复调用reg的exec方法,传入参数html,将结果保存到arr中,再判断不等于null
    while((arr=reg.exec(html))!=null){
    //  输出: 在位置 ? 发现url  ?
    //      arr.index  RegExp.$1
        console.log("在位置 "+arr.index+" 发现url: "+RegExp.$1);
    }
  如何获取*本次*匹配的关键词中分组的子内容:
    RegExp.$n

何时使用 示例化对象: var reg=new RegExp(“正则”,”gi”)
当动态生成正则表达式

    var kwords=
        ["明明","静静","日日","李雷"/*,"大智慧"*/];
    var str="明明喜欢我,却不告诉我;"
           +"我想静静"
           +"静静是谁"
           +"你先告诉我明明是谁"
           +"日日思君不见君"
           +"日日是谁"
           +"你的语文是李雷教的吗?"
           +"我的语文是大智慧教的";
    var reg=new RegExp(kwords.join("|"),"g");               
//在关键词之间加入或(”|”)
    var arr=null;
    //反复调用reg的exec方法,传入str,将结果保存在arr中,只要不是null,就继续循环
    while((arr=reg.exec(str))!=null){
    //  输出: 在位置 ? 发现关键词 ?

        console.log("在位置"+arr.index
                    +"发现关键词"+arr[0]);
    }
  1. 验证字符串格式:
    var bool=reg.test(str);
    返回值: 验证通过,返回true,否是返回false
    强调:reg都要前加^,后加$
//验证:
    var reg=/^(?![a-z0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,16}$/;
    //反复调用reg的test方法,请用户输入密码直接作为参数,只要验证*不*通过,就继续循环
    while(!reg.test(prompt("输入新密码"))){
    //  提示 密码强度不够!
        alert("密码强度不够!");
    }//(循环结束)
alert("密码修改成功");//提示密码修改成功

笔试题 去掉数组中重复的

<!DOCTYPE html>
<html>
 <head>
  <title> new document </title>
  <meta charset="utf-8">
  <script>
    //去掉数组中重复的元素
    //2个变化: 1. 保留重复元素中的一个
    //         2. 将重复元素全部删除
    for(var i=0,arr=[];i<10;i++){
        arr.push(parseInt(Math.random()*25));
    }
    console.log(String(arr));
    function quchongfu(arr){//局部变量
//   //10k/月
//      //a,,a,,b,,b,,b,,c,,d,,d
//      arr.sort();
//      var str=arr.join(",,");
//      var reg=/(^|,)([^,]+)(,,\2)+(,|$)/g;
//             // $1     $2    $3    $4
//      //case1: 保留重复元素中的1个
//      //str=str.replace(reg,"$1$2$4");
//      //case2: 删除所有重复元素
//      str=str.replace(reg,"");
//      console.log(str);
        .replace(/^,|,$/g,"");
//      arr=str.split(",,");//局部变量arr引用新数组
//      return arr;//必须将新数组返回,外部才能获取到

        return arr.sort()//15k/月
                  .join(",,")
                  .replace(
            /(^|,)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").split(",,");
            /(^|,)([^,]+)(,,\2)+(,|$)/g,"").replace(/^,|,$/g,"")
            .split(",,");
    }
    arr=quchongfu(arr);//全局变量
    console.log(String(arr));
  </script>
 </head>

 <body>

 </body>
</html>
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐