WEB前端第四十课——正则表达式-RegExp、高级

  • A+
所属分类:Web前端
摘要

1.RegExp对象  正则表达式的基本语法是:/正则表达式主体/修饰符(可选),这种创建正则的方法称为“字面量创建正则表达式”。

1.RegExp对象

  正则表达式的基本语法是:/正则表达式主体/修饰符(可选),这种创建正则的方法称为“字面量创建正则表达式”。

  在 js中已经为正则表达式提供了一个“构造函数RegExp”,我们可以通过这个构造函数生成正则表达式的实例,

  这种创建正则的方法称之为“构造函数创建正则表达式”。

  对于RegExp函数生成的正则实例,既能够和之前使用正则表达式一样直接使用,还可以调用一些RegExp独有的方法。

  语法:

    var reg = new RegExp('正则表达式主体','修饰符');  //RegExp也称为“正则类”

    注意,通过构造函数方式创建正则表达式,参数均采用“字符串”的形式来声明!

    特别注意,这种方式的正则表达式主体在使用元字符时,需要使用转义字符“”,比如“\d、\s”等

2.RegExp对象方法

  ① test()方法,用于判断在目标字符串中是否存在满足正则表达式规则的子字符串,返回值为Boolean。

    语法:正则表达式 .test( ' 指定字符串 ' );  // true || false

    示例:

      var regExp = new RegExp('ab', 'g');

      var res = regExp .test('abc123AABBCC');

      console .log(res);  //返回值为“true”

    RegExp中提供的方法对于“字面量创建正则表达式”也是适用的,示例如下:

      console.log(/ab/g .test('abc123AABBCC'));  // true

  ② exec()方法,用于查找在目标字符串中“第一个”满足正则表达式的子字符串出现的“下标和内容”

         返回值是一个信息集合(对象),可以像数组一样使用,查找失败则返回 null

    语法:正则表达式 .exec('目标字符串');

    示例01:

      var regExp = new RegExp('ab', 'ig');

      var res = regExp .exec('abc123AABBCC');

      console .log(res);  //返回值:["ab", index: 0, input: "abc123AABBCC", groups: undefined]

      res = regExp .exec('abc123AABBCC');

      console .log(res);  //返回值:["ab", index: 7, input: "abc123AABBCC", groups: undefined]

      res = regExp .exec('abc123AABBCC');

      console .log(res);  //返回值:null

    可以看出,当 exec()方法连续多次查找时,每次查找都是建立在前一次的基础上,依次向后匹配。

    这是由于RegExp正则对象中提供了一个隐式参数“lastIndex”,

    这个参数将记录每次执行检索完成时,匹配结果的最后一个字符的下标,并且将其作为下次检索的开始位置。

    这个属性是可写的,

      如果上述示例中第一次检索完成后增加“res.lastIndex=0;”,那么第二次检索返回值将和第一次相同。

    示例02:

      var regExp = new RegExp('(ab)c', 'ig');

      var res = regExp .exec('abc123AABBCC');

      console .log(res);  //返回值:["abc", "ab", index: 0, input: "abc123AABBCC", groups: undefined]

      console .log(res.length);  // 返回值:2

    上述结果看出,当声明正则的时候,如果参数中存在小括号(又称作组匹配符号),
    那么返回结果的 length就不为“1”(即不仅查找一次),
    也就是说第一次查找“正则主体内容”,第二次查找“组匹配内容”,两次结果一起返回。

3.检索模式的“^和$”字符

   “ ^ ”初位字符,表示判断字符串以某个内容开始

  “ $ ”末位字符,表示判断字符串以某个内容结束

  语法示例:

    var regExp = new RegExp('^abc','ig');  //判断是否以abc字符串开始

    var regExp = new RegExp('abc$','ig');  //判断是否以abc字符串结束

  如果同时使用“^和$”(如“^abc$”),表示在目标字符串中与正则字符串本身相同

  代码示例:

    var regExp=new RegExp('c$','ig');     var str='abc123AABBCC';     var res=regExp.test(str);     console.log(res);    // true 

4.重复类

  重复类是正则表达式中使用大括号“{}”进行检索的一种模式,{}用来匹配符合正则要求的字符串连续出现的次数。

  通常配合表达式模式一起使用

  常见写法有以下三种:

    {n},表示检索内容连续出现 n次

    {n,},表示检索内容至少连续出现 n次

    {n,m},表示检索内容连续出现大于等于 n次,小于等于 m次

  语法示例:

    var regExp = new RegExp('[a-z]{2}','g');  //表示 全局检索连续出现的两个小写字母

  代码示例:

    var regExp=new RegExp('[a-z]{2}','ig');     var str='abc123AABBCC';     var res=str.match(regExp);     console.log(res);    //返回结果:(4) ["ab", "AA", "BB", "CC"] 

  注意,如果不存在“组匹配符号”,那么重复类仅对其前面的一个字符有效!

  示例代码:

    var regExp=new RegExp('ab{2}','ig');     var str='abcabc123AABBCC';     var res=str.match(regExp);     console.log(res);    //返回结果:["ABB"] 

    var regExp=new RegExp('(abc){2}','ig');     var str='abcabc123AABBCC';     var res=str.match(regExp);     console.log(res);    //返回结果:["abcabc"] 

5.贪婪模式、懒惰模式

  贪婪模式(greed)、懒惰模式(lazy),这两种模式都是被固化至表达式内的两种隐形的检索模式,

  它们不属于任何一种前述的检索模式,而是在此之外隐形生效的。

  贪婪模式,

    正则要求就一直向下匹配,直到无法再匹配为止的行为模式(如 n*)

  懒惰模式,

    一旦匹配到符合正则要求的内容就立即结束检索的行为模式(如 n?)

  在正则中,不同的符号可以隐式说明当前的正则是采用贪婪模式还是懒惰模式。

  常见符号:

    贪婪模式:+、*、{n,}、{n,m}、……

    懒惰模式:+?、?、*?、{n}、{n}?、{n,m}?、……

  代码示例:

    //---贪婪模式---     var regExp=new RegExp('s[a-z0-9]+s','ig');     var str='abscabc12S3AeSvBhC2286s96';     var res=str.match(regExp);     console.log(res);    //返回值:["scabc12S3AeSvBhC2286s"] 

    //---懒惰模式---     var regExp=new RegExp('s[a-z0-9]+?s','ig');     var str='abscabc12S3AeSvBhC2286s96';     var res=str.match(regExp);     console.log(res);    //返回值:["scabc12S", "SvBhC2286s"] 

6.脱字符  

  脱字符是正则中“^”符号的一种特殊表达方式,表示“不是……”的意思,

  当且仅当“^”符号出现在中括号的首位时,我们称之为脱字符。

  写在正则主体首位而不是中括号内表示初位字符,写在中括号内却没有写在首位则表示普通字符。

  中括号内只有脱字符时“[^]”,表示所有字符!

  代码示例:

    var regExp=new RegExp('[^bc]+','ig');     var str='abscabc12S3AeSvBhC2286s96';     var res=str.match(regExp);     console.log(res);    //返回结果:["a", "s", "a", "12S3AeSv", "h", "2286s96"]