加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

JavaScript RegExp 基础详谈

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

      说明:嵌套分组从外向内获取
      示例:

1 var str = 'abc';
2 var pattern = /(a?(b?(c?)))/;
3 pattern.test(str); 
4 console.log(RegExp.$1) //-> abc
5 console.log(RegExp.$2) //-> bc
6 console.log(RegExp.$3) //-> c

   3.8 前瞻

    对于人的习惯而言,我们认为我们在看一段话的顺序是从前到后的阅读顺序,但是对于计算机而言,
    已经识别到的则是“后”,而未能或者即将识别的区域则是“前”。所以正则前瞻的本质含义就是判断前方的内容是否是符合匹配条件。
    如果符合匹配条件,那么“正向前瞻”就为true,否者为false。如果不符合匹配条件,那么“负向前瞻”为true,否则为false。
    下面解释用到的“后续内容”字眼,是从我们人的习惯出发加以说明的。

    · (?=) 正向前瞻

      说明:“正向前瞻”是根据后续内容是否符合匹配条件来返回匹配的结果。
      示例:

1 var str = 'google';
2 var pattern = /goo(?=gle)/;
3 console.log(pattern.exec(str)[0]); // -> goo

      从示例我们可以看出,goo是我们要匹配的结果,而(?=gle)则是后续内容的判断条件,一旦字符串中有符合goo后续为gle的字符串,那么就返回匹配结果。goo。

    · (?!) 负向前瞻

      说明:“负向前瞻”是根据后续内容是否不符合条件来返回匹配的结果。
            “负向前瞻”与“正向前瞻” 含义与功能相反。
      示例:

1 var str = 'google';
2 var pattern1 = /goo(?!gle)/;
3 var pattern2 = /goo(?!ogl)/;
4 pattern1.test(str) // -> false 因为gle是符合goo的后续内容的,所以返回false,条件不成立。
5 pattern2.test(str) // -> true 因为ogl不是goo的后续内容,所以返回true,条件成立。

    * 前瞻是一种零宽度断言匹配。  

      世界本来没有路,只是人走多了,自然就有了路,同样的道理,零宽度断言,虽然听上去怪怪的,还有点反人类的感觉,
      但是多说说也就习惯了。毕竟只是一个取名的问题而已,无需较真。所谓的“零宽度”,指的就是其匹配的位置不会发生改变。
      而“断言”,则用来声明一个应该为真的事实。因此我们前面学习到的 “正向前瞻” 也叫 “零宽度正预测先行断言”。
      用一句话概括其功能:
        零宽度断言匹配不会捕获或保存匹配结果,更加不会改变匹配时的匹配位置(lastIndex)。
        匹配的起始位置也是它匹配的结束位置。所以匹配位置固定不变。

 

      示例:

1 var str = 'find123';
2 var pattern = /(?=find)d+/;
3 alert(pattern.test(str)) // -> false

      就如我们前面说到的那样,前瞻是一种零宽度匹配,而零宽度的特点概要来说,就是不捕获匹配内容,不改变匹配位置。
      首先,整个匹配顺序是从左到右,左为后,右为前。在位置0处正则的控制权交由(?=find)去匹配,此时在位置0处向右尝试检索find字符串,
      并且成功检索到所以匹配成功,但并不捕获内容,也不改变匹配位置,所以从位置0处开始匹配,也从位置0处结束匹配,
      接着匹配控制权交由d+,然后从位置0处开始匹配(因为之前的零宽度并未改变匹配位置),
      再向右检索数字的时候,发现位置0为f,位置1位i ... 所以匹配失败,最终返回false。

1 var str = 'abcfind123';
2 var pattern = /abc(?=find)findd+/;
3 alert(pattern.test(str)) // -> true

      这个示例的返回结果为true,让我们仔细分析以下,首先,从左向右匹配,位置0,位置1,
      位置2 等处的字符串abc正好与正则表达式吻合,所以匹配成功,接着从位置3处将匹配控制权交由(?=find),
      此时正则表达式从位置3处开始向右检索字符串find,检索到所以匹配成功,然后在位置3处结束检索,
      将控制权分别交由位置3的find 到 位置6的d 这一过程都是匹配成功的,再接着将匹配控制权交由d+,
      从位置7开始到结束都是数字,所以最终的匹配结果为true。

  3.9 运算符

    相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:

 

 

 

 

 

  

  3.10 其它

    · 控制字符匹配

      cX
      X是a-Z之间的字符,cX则表示匹配control+X形式的控制字符。
      但是在实际的测试中,发现通过cX匹配任意字符都是为空,因此猜测该正则在浏览器中并不支持,或者是所应用的场合环境比较特殊。
      下面是具体的测试代码:

 1 var pattern = '',
 2     str = '',
 3     c = '',
 4     r = '';
 5 for(var i=0;i<255;i++){
 6     str+=String.fromCharCode(i);
 7 }
 8 for(var i=65;i<90;i++){
 9     c = String.fromCharCode(i);
10     pattern = new RegExp('c'+c);
11     r = str.match(pattern);
12     r?console.log(r,c,pattern):'';
13 }

    · 修饰符m对位置元字符的影响。

(编辑:PHP编程网 - 黄冈站长网)

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

热点阅读