加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

JavaScript RegExp 基础详谈

发布时间:2016-11-02 04:51:05 所属栏目:教程 来源:站长网
导读:副标题#e# 前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究、学习、掌握,而是抱着需要的时候,就去网上找现成的正则表达

      实例属性,就是指必须进过声明或实例化后的正则表达式对象方能调用的属性。
      下面所有属性的说明,就以下代码为例进行说明:

var pattern = /w?/g;

      - ingoreCase
        功能:修饰符属性,只读。判断指定正则表达式是否开启大小写,返回值布尔值。
        示例:pattern.ingoreCase

      - global
        功能:修饰符属性,只读。判断指定正则表达式是否开启大小写,返回值布尔值。
        示例:pattern.global

      - multiline
        功能:修饰符属性,只读。判断指定正则表达式是否开启多行模式,返回值布尔值。
        示例:pattern.multiline

      - lastIndex
        功能:返回当前匹配结果下一次匹配的起始位置。也可以手动设置lastIndex的值,用于设置指定的起始位置。
        示例:

1 var desc = 'hellow,hi,oh';
2 pattern.test(desc) 
3 console.log(pattern.lastIndex) //-> 1;
4 pattern.lastIndex = 2;
5 console.log(pattern.lastIndex) // -> 3;

      - source
        功能:返回正则表达式对象的正则规则。
        示例: console.log(pattern.source) // -> w? 

      * ingoreCase、global、multiline等均为只读属性,不能直接修改正则表达式的修饰符。
      * lastIndex的值,只能在RegExp内置方法中才能够使用到。

 

  正则表达式是有两种字符模式组成:“普通字符”、"元字符"。通过这两种字符模式的结合使用,可以编写出符合我们要求的正则规则。
  普通字符:
    就是由显性的没有特殊含义的打印字符和没有指定为元字符的非打印字符组成。
    显性的打印字符,它是实际可见的,例如0-9,a-z,除了可打印的字符,还存在一些非打印的字符,例如ASCII码值在0-31的为控制字符,
    无法显示和打印,但实际存在。

  元字符:元字符更接近计算机语言中的变量含义,它可以代表某种特殊的含义,并且会根据使用场合不同,其具体的含义也不尽相同。

  普通字符很好理解,按照计算机语言中的字面量去理解就可以,我们着重研究“元字符”。
  元字符,根据其特性与含义,又可以分为以下几个小类去说明:

  3.1 特殊字符一览表:

JavaScript RegExp 基础详谈

   3.2 转义运算符

    功能:对元字符进行转义,使其转换为普通字符。
    示例:

1 var pattern = /[/;
2 var str = '[]';
3 console.log(pattern.test(str)) // -> true;

  3.3 量词

    ?:表示匹配0次或1次
    +:表示匹配1次或多次
    {n}:表示匹配n次
    {n,m}:表示匹配n到m次
    {n,}:表示至少匹配n次

  3.4 边界

    b:匹配单词边界,用于匹配一个整体的单词时使用。
    B:匹配非单词边界。
    ^:强制首匹配,以指定规则开始的字符,避免前导的其它字符。
    $:强制尾匹配,以指定规则结束的字符,避免后导的其它字符。

  3.5 类

   “类”是具有相同特征的集合,是一个泛指。

   · 字符类
     [abc]:只根据区间内的内容进行匹配。

   · 范围类
     [a-zA-Z0-9]:匹配大小写字符a-z以及数组0-9的范围

   · 反向类
     [^a-z]:取反匹配。匹配不在这个区间范围内的内容,

   示例:

1 var str = 'google';
2 var pattern = /[gle]/;
3 console.log(pattern.test(str))

  3.6 贪婪模式与非贪婪模式

    贪婪模式会按照匹配规则尽可能的去匹配,一直到匹配失败。
    非贪婪模式则会根据最小匹配规则去匹配。
    以匹配规则为例来说,贪婪是指匹配所有符合规则的结果,按照最大可能的结果去匹配,而非贪婪则只要有匹配结果便会停止匹配。
    从量词上看:*+?都是贪婪匹配,因为*+?都会按照匹配规则尽可能的去匹配。
    例如*匹配零个或多个,但实际匹配上,会以多个的情况为优先匹配。

      贪婪匹配       非贪婪匹配
      + 一次或多次    +? 只匹配一次
      ? 0次或一次      ?? 匹配 0次
      * 0次或多次      *? 匹配0次
      {n} n次     {n}? 按照n次匹配
      {n,} 最少n次    {n,}? 按照n次匹配
      {n,m} n到m次    {n,m}? 按照n次匹配

    取消贪婪模式也很简单,在原有的基础上附加上一个?号,这时就改为非贪婪模式,一旦条件满足,就不再往下匹配。

    示例:

1 var str = 'aaa',
2 pattern1 = /a*/,
3 pattern2 = /a*?/;
4 pattern1.exec(str); // -> aaa 
5 pattern2.exec(str); // -> ''

  3.7 分组

    分组就是把要匹配的结果作为一个组一个整体来看待。因此只要是属于该分组的信息,都要放在()符号内。

    · () 捕获性分组

      示例:

1 var str = '123abc';
2 var pattern = /(d{4})(w+)/;
3 pattern.test(str); 
4 console.log(RegExp.$1) //-> 123
5 console.log(RegExp.$2) //-> abc

    · (?:) 非捕获性分组

      示例:

1 var str = '123abc';
2 var pattern = /(d{3})(?:w+)/;
3 pattern.test(str); 
4 console.log(RegExp.$1) //-> 123
5 console.log(RegExp.$2) //-> '';

    · ((...)) 嵌套分组

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读