正则表达式

作者: Nicklzy | 来源:发表于2016-08-26 22:53 被阅读58次

    \d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^$分别是什么?

    • \d 查找数字
      var str = "123qwer4556honidf&**.q"
      console.log(str.match(/\d/g))
      //["1", "2", "3", "4", "5", "5", "6"]
    • /w 查找单词字符(字母、数字、下划线)。
      var str="Give 100%!____----";
      console.log(str.match(/\w/g))
      //["G", "i", "v", "e", "1", "0", "0", "", "", "", ""]
    • \s 查找空白字符(空格、tab、换行、回车)。
      var str = "d were fsdf er er r "
      console.log(str.match(/\s/g))
      //[" ", " ", " ", " ", " ", " ", " ", " "]
    • [a-zA-Z0-9] 查找a-z的小写字母以及大写字母,0-9的数字
      var str = "d HI50fwe 123eqrqw%^@&r3"
      console.log(str.match(/[a-zA-Z0-9]/g))
      //["d", "H", "I", "5", "0", "f", "w", "e", "1", "2", "3", "e", "q", "r", "q", "w", "r", "3"]
    • \b 匹配单词边界。

    补充


    • .查找单个字符,除了换行和行结束符。
      var str="That's hot!";
      var patt1=/h.t/g;
      console.log(str.match(patt1));
      //["hat", "hot"]
    • + 匹配前面的子表达式一次或多次。
      例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
      var str = "10 100 1000 10000 1"
      console.log(str.match(/10*/g))
      结果["10", "100", "1000", "10000"]
    • *匹配前面的子表达式零次或多次。
      例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
      var str = "10 100 1000 10000 1"
      console.log(str.match(/10*/g))
      结果["10", "100", "1000", "10000", "1"] (贪婪模式)
    • ? 匹配前面的子表达式零次或一次。
      例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
      var str = "10 100 1000 10000"
      console.log(str.match(/10?/g))
      结果["10", "10", "10", "10", "1"] (非贪婪模式)

    http://www.runoob.com/regexp/regexp-syntax.html

    • n{X} 匹配包含 X 个 n 的序列的字符串。
    • n{X,}匹配包含至少 X 个 n 的序列的字符串。(贪婪模式)
    • n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。(贪婪模式)
    • n$ 匹配任何结尾为 n 的字符串。
    • ^n 匹配任何开头为 n 的字符串。
    • [^abc]查找任何不在方括号之间的字符。

    贪婪模式和非贪婪模式指什么?

    • 贪婪模式:量词在默认下是尽可能多的匹配的
    • 非贪婪模式让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试(在量词后加?即可)

    代码题

    写一个函数trim(str),去除字符串两边的空白字符

    function trim(str){
      return str.replace(/^\s+|\s+$/g,"")
    }
    

    注意点:得写+$而不能是$+,不加+会导致两边若空格多于一个无法清理。

    使用实现 addClass(el, cls)、hasClass(el, cls)、removeClass(el,cls),使用正则

    function hasClass(el, cls){
      var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
      return reg.test(el.className);
    }
    function addClass(el, cls){
      if(!hasClass(el, cls)){
       return el.className += " " +cls;
      }
    }
    function removeClass(el, cls){
      if(hasClass(el, cls)){
       el.className = el.className.replace(cls,"").replace(/\s{2,}/g, ' ').replace(/^\s+|\s+$/g,"");
      }
    }
    

    代码注意点
    replace不会导致原字符串改变
    ).replace(/\s{2,}/g, ' ').为的是保证中间的词条清除时,产生的两个空格变为一个
    .replace(/^\s+|\s+$/g,"")为的是保证清除末尾以及开头删除时产生的空格

    写一个函数isEmail(str),判断用户输入的是不是邮箱

    function isEmail(str){
      var pat = /^[\w\-]+@[\w\-]+\.((com)$|(cn)$)/;
      return pat.test(str)
    }
    

    写一个函数isPhoneNum(str),判断用户输入的是不是手机号

    function isPhoneNum(str){
      var pat = /1\d{10}$/
      return pat.test(str)
    }
    

    写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)

    function isValidUsername(str){
      var pat = /^\w{6,20}$/;
      return pat.test(str);
    }
    

    写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种)

    function isValidPassword(str){
      if(str.length<6 || str.length>20){
        return false
      }
      if(/[^A-Za-z_0-9]/.test(str)){
        return false
      }
      if(/(^[a-z]+$)|(^[A-Z]+$)|(^_+$)|(^[0-9]+$)/g.test(str)){
        return false
      }
      return true
    }
    

    代码思路:至少两种等同于只有单一的一种即可
    代码注意:需要在符合的条件后面跟上+符号。

    写一个正则表达式,得到如下字符串里所有的颜色(#121212)

    var re = /*正则...*/
    
    var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "
    
    alert( subj.match(re) )  // #121212,#AA00ef
    

    代码如下

    var re = /#[A-Fa-f0-9]{6}/g;
    

    代码书写错误:
    1、之前在#前面加了^,这样意味着颜色得在字符串的开头位置。
    2、没有加g,导致后面的颜色没有出现

    下面代码输出什么? 为什么? 改写代码,让其输出hunger, world.

    var str = 'hello  "hunger" , hello "world"';
    var pat =  /".*"/g;
    str.match(pat);  
    

    为贪婪模式。输出[""hunger" , hello "world""]
    改写后

    var str = 'hello  "hunger" , hello "world"';
    var pat = /".*?"/g;
    console.log(str.match(pat));
    

    补全如下正则表达式,输出字符串中的注释内容. (可尝试使用贪婪模式和非贪婪模式两种方法)

    str = '.. <!-- My -- comment \n test --> ..  <!----> .. '
    re = /.. your regexp ../
    str.match(re) // '<!-- My -- comment \n test -->', '<!---->'
    

    贪婪模式

    re=/<!--[^>]*-->/g
    

    非贪婪模式

    re=/<!--[\w\W]*?-->/g
    

    补全如下正则表达式

    var re = /* your regexp */
    
    var str = '<> <a href="/"> <input type="radio" checked> <b>'
    str.match(re) // '<a href="/">', '<input type="radio" checked>', '<b>'
    

    贪婪模式

    re= /<[^>]+>/g
    

    非贪婪模式

    re=/<[^>]+?>/g)
    

    相关文章

      网友评论

        本文标题:正则表达式

        本文链接:https://www.haomeiwen.com/subject/imqasttx.html