正则表达式

2. 正则表达式:规定字符串中字符出现的规则!

     何时使用:2种:

         1. *验证*一个字符串的规则:

         2. 使用关键字规则,在一段话中模糊*查找*关键字时

 

   如何定义正则表达式:

    1. 最简单的正则表达式:不带任何特殊符号的*原文*

         比如;/no/  /我草/

    2. 字符集:使用中括号包裹的备选字符的列表

       **如何使用:一个[],仅匹配一位字符!

                   每次必须从[]中选一个匹配,不能不选

    比如:银行卡密码:6位数字

      [0123456789][0123456789]... ...[0123456789]

       如果备选字符集是连续的,可用-简写,-读作"到":

      [0-9][0-9][0-9][0-9][0-9][0-9]

      [a-zA-Z]匹配所有字母

      [a-zA-Z0-9]匹配所有字母或数字

       排除字符集:[^要排除的字符]

    比如:4位房间号不能包含4或7

      [^47]

    2. 预定义字符集:对常用字符集的简化

      [0-9]-->\d: 所有数字字符

      [0-9a-zA-Z_]-->\w: 所有字母,数字或_

      \s: 所有空字符:空格,制表符...

    比如:6位数字:\d\d\d\d\d\d

      强调:一个预定义字符集,仅能匹配一位字符

     

      \大写字母:除了原字符集内容

      最特殊的预定义字符集:. 表示除换行外,所有字符

 

    3. 数量词:规定*前一个*相邻字符集出现的次数

         字符集{min,max}: 字符集至少出现min次

                                最多不能超过max次

    比如:6-8位数字密码:\d{6,8}

         字符集{min,}: 字符集至少出现min次,多了不限

         字符集{n}: 字符集只能出现n次

    比如:身份证号前15位必须是数字 \d{15} 

          后三位是2位数字+1位数字/xX \d\d[0-9xX]

          后三位可有可无:{0,1}==>?

    \d{15}(\d\d[0-9xX])?

 

         特殊数量词:

          字符集? : 字符集{0,1} 可有可无,最多只能1次

          字符集* : 字符集{0,}  可有可无,次数不限制

          字符集+ : 字符集{1,}  至少一次,多了不限

比如:手机号:前三位可以是+86或0086,可有可无,最多只能1次

             若干个空字符

             1

             手机号部分的第二位在3,4,5,7,8中选其一

             之后是9位数字

    ((\+86)|(0086))?\s*1[34578]\d{9}

    强调:如果正文中的内容和正则表达式特殊符号冲突

          可用\转义

 

    指定匹配位置:

       ^表达式:表示必须以表达式匹配的内容开头

       表达式$:表示必须以表达式匹配的内容结尾

       ^表达式$:必须和表达式完全匹配!

            只要在程序中执行*验证*,都要前加^,后加$

       ^表达式1|表达式2$:

                 匹配以表达式1开头的部分

              同时匹配以表达式2结尾的部分

       比如:^\s+|\s+$ : 匹配字符串开头或结尾的空字符

    

    用户名:6位以上,必须以字母开头,

           至少包含一位数字,以及一位大写字母

       先预匹配,再按表达式正常匹配

       首先,检查不全是字母:(?![a-zA-Z]+$)

          说明可能包含数字

          如果第一检查没通过,说明全是字母,就无效

       其次,检查不全是数字或小写字母:(?![0-9a-z]+$)

          说明可能包含大写字母

       最后,[a-zA-Z][0-9a-zA-Z]{5,}

(?![a-zA-Z]+$)(?![0-9a-z]+$)[a-zA-Z][0-9a-zA-Z]{5,}

 

1. RegExp:正则表达式对象:

     封装了一条正则表达式,提供了用正则表达式执行验证和查找的功能。

     创建RegExp对象:2种:

       1. 正则表达式固定的:

          var reg=/正则表达式/ig;

       2. 正则表达式可能发生变化:

          var reg=new RegExp("正则表达式","ig");

 

RegExp API:  

    1. 查找关键字:var arr=reg.exec(str); 

            reg对象中封装了关键字

            str指待检查的目标字符串

       功能:既返回关键字内容,又返回关键字位置。

       但每次仅返回一个关键字。需要while循环配合反复执行           arr[0]中保存关键字的内容。

          arr.index中保存关键字的位置

       强调:exec每次找完,自动将reg.lastIndex属性修改              为下次开始查找位置。不用程序员手工维护。

       *如果找不到,则返回null!*

    查找:找有没有:str.search(reg) 没有返回-1

          找个数/内容:str.match(reg) 没有返回null

          找每个关键字的位置:

       str.indexOf("关键字"[,lastIndex]) 没有返回-1

          即找内容,又找位置:reg.exec(str) 没有返回null

 

    2. 验证:var bool=reg.test(str)

         reg中封装了规则

         str中传入待验证的字符串

       如果字符串完全符合规则,则返回true,否则返回false

    比如:密码8位以上,只能包含字母,数字

          至少包含1位数字和一位大写字母

      首先:预判字符串不都是字母:可有还有数字或符号

          (?![a-zA-Z]+$)

  其次:预判字符串不都是小写字母和数字:可能有大写或符号

          (?![a-z0-9]+$)

      可有还有数字或符号,可能有大写或符号

      最后:限制字符必须是字母或数字:

           [a-zA-Z0-9]{8,}

   结果:(?![a-zA-Z]+$)(?![a-z0-9]+$)[a-zA-Z0-9]{8,}

 

   ***课后练习:

     问题1:贪婪模式:正则表达式默认匹配最长的字符串

     原因:(.*)  (.+)

     贪婪模式,改懒惰模式:(.*?) (.+?)

     懒惰模式:匹配最小的字符串

     问题2:获得正则表达式匹配结果中的部分子内容:2步:

        1.在正则表达式中用圆括号括出子部分对应的表达式

    2.在本次查找之后,使用RegExp.$n:获得表达式中第n个括号对应的子内容。

     RegExp.$n:获得正则表达式本次查找中的第n个括号内容

 

String中支持正则的API:

    1. 查找: str.search(reg)   str.match(reg)

    2. 替换: str.replace(reg,"替换内容")

      str.replace(/我[去草][去草]/g,"***");

      *在"替换内容"中,可使用$n,直接代替子内容*

    3. 分割: str.split(reg)

      var str="eric ,     rose,scott   ,  john";

 

posted @ 2015-12-13 15:26  白艳风  阅读(268)  评论(0编辑  收藏  举报