从本文开始,我将陆续的更新关于jQuery源代码的博客。首先,jQuery源代码分析一直是我的一个计划和追求。查看jQuery源代码,探索大牛们深邃的思想,精神的碰撞。Google 搜索不难发现,探索jQuery 的人不在少数,由此可见,jQuery整体的架构,模式创建多么的耐人寻味。本系列属于本人原创,本着低调,详细的态度,开始我的jQuery 之旅。本次阅读 jQuery 1.9.1。

正则表达式解析

一:想看源码,就要搞懂jquery里面的正则。在没看源码之前,我就认为,jquery离不开正则。下面的jQuery 用到的全局标量,全是正则啊。

为了我们能看懂后续的代码,先要过了基本功。

二:正则,基本的不讲了,主要讲一些比较难的括号/()/匹配以及他的常用搭配 ?,?:,?!。

  1.贪婪式与非贪婪式。

    当我们用正则表达式的重复匹配字符时,是尽可能多的匹配,允许后续的匹配的正则表达式继续匹配。/a{3,}/匹配的是至少3个a,所以/a{3,}/ 可以匹配 aaas,也可以匹配aaaaaasds,但是它是尽可能多的匹配,如aaas中匹配的是aaa,aaaaaaaas中匹配的是aaaaaaaa。这就是所谓的贪婪匹配。我们也可以用正则表达式进行非贪婪式匹配。只需在在带匹配的正则后面加上问号即可:"??","+?","{3,5}?","*?"。他表示的是尽可能少的匹配。比如刚才的/a{3,}/匹配3个或3个以上连续的a,/a{3,}?/也是匹配3个或3个以上的连续a,但是它是较少的匹配。用aaaaaas作为匹配字符串,对于/a{3,}/实际上匹配的字符串是aaaaaa,而对于/a{3,}?/实际上匹配的则是aaa。这就是非贪婪匹配,可以这么理解为去匹配项的最小匹配项。实例结果如下

      

  但是有的时候非贪婪模式与我们期待的并不一样。比如/a+?d/是匹配一个或多个连续的a和一个b,匹配字符为aaaaad,按照非贪婪匹配,你期望的是匹配最后的一个a和d,实际上全部匹配。这个贪婪匹配效果一样。如图:

      

    

  2.选择,分组和引用。

    这就是要重点谈的()的作用了。

    a) "()"把单独的项做成一种表达,以便处理独立的单元,以便像处理独立单元那样使用"|","*","+"和"?"来对单元内的项进行处理。比如/java(script)?/ 既可以匹配 java,也可以匹配javascript。/(ab|cd)+|ef/ 既可以匹配ef,也可以匹配多个重复ab或cd.

    b)"()"在完整的模式中定义子模式。当一个正则表达式与一个目标串相匹配时,可以抽出与圆括号中子表达式相匹配的部分。定义锚点,在符号"(?="和”)“之间的加入一个表达式,它就是断言,也就是值子表达式的必须先匹配。如/java(script)?(?=\:)/可以匹配javascript:你好,但不能匹配javascript nihao ,因为没有断点。

    

同理就有(?!),负向断言,表示"(?!"和")"里面的不必匹配。如/[Jj]ava(?!script)[a-zA-Z\w]*/,可以匹配 java,javasfdsfds,但是不可以匹配 javascript..。

    c)"()"的还一个用途就是对同样一正则表达式的后部引用前面的子表达式。通过字符"\" 加 数字n 来表示对前面第n个括号内的匹配的文本 ,注意是目标串的文本。需要注意的是因为字表达式可以嵌套 比如/ad(dsfds(sd)+?)/,所以它的位置就是以参与计数的左括号的位置n。比如/['"][^'"]+['"]/是用来匹配位于单引号或双引号之内的字符,如"sdf","ds','fsa','fds",但是要想匹配前后引号必须相同的中间的字符,就要用到引用了。刚才的正则变形为:/(['"])[^'"]+\1/。有的时候,正则表达式里有多个圆括号的子表达式,但是,有的我不需要引用,如何呢?我们就要用(?:)。表达式"?:"只是用来分组的,没有匹配的作用。例如:

/([Jj]ava(?:[Sscript])?)\sis\s(fun\w*)其中(?:[Sscript])仅仅用于分组,\2引用了与(fun\w*)相匹配的文本。

  三:jQuery 的正则都是什么?

    core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,由此可以看出是数字的匹配,包括了正负数,和科学技术法的数学表示。

    core_rnotwhite = /\S+/g, 简单,非空白(谢谢博友的指正)

    rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g ,表示不同序列编码的空格开始或结尾

    rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,表示的是html标签必须是"<字符>字符"或者是"#字符"

     rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,表示的是html标签;这里面出现了括号的引用。

    rvalidchars = /^[\],:{}\s]*$/,表示json的常用符号,且都是结尾的符号,比如:{}],

    rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,表示json数组的开始符号"["或者是":["或者是",["

    rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,表示的是含有/n,/b,/f,/r,/t或十六进制的字符

    rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, 表示数字或者true,false,null,""

    rmsPrefix = /^-ms-/,表示css的前缀,判断ie
    rdashAlpha = /-([\da-z])/gi,表示有链接符“-”的数字或字符

    

总结:今天这部分算是过关了。分析还要继续

转载于:https://www.cnblogs.com/kukuchong/p/3555083.html

jQuery 之正则表达式篇相关推荐

  1. jQuery笔记总结篇

    首先,来了解一下jQuery学习的整体思路 jQuery系统学习篇 jQuery系统学习篇-XMind源文件提供参考下载 Jquery笔记 jQuery笔记总结-XMind源文件提供参考下载 第一节 ...

  2. JQuery学习04篇(层次选择器)

    直接po图和代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  3. JQuery学习22篇(事件委托)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. jQuery选择器正则表达式

    本文翻译自:jQuery selector regular expressions I am after documentation on using wildcard or regular expr ...

  5. 自己动手写一个JQuery插件(第二篇)(转)

    1.Hold住,我们要开始动真格了! 是的,看到这个标题,你一定也和我一样迫不及待了,因为我们不像之前那篇教程一样小打小闹了,我们现在要动真格了,这次我们要写的插件是上个插件的增强版本.而这个插件包含 ...

  6. jquery easyUI第一篇【介绍、入门、使用常用的组件】

    tags: web前端库 什么是easyUI 我们可以看官方对easyUI的介绍: easyUI就是一个在Jquery的基础上封装了一些组件....我们在编写页面的时候,就可以直接使用这些组件...非 ...

  7. 自己动手写一个jQuery插件(第二篇)

    hold住,我们要开始动真格了! 是的,看到这个标题,你一定也和我一样迫不及待了,因为我们不像之前那篇教程一样小打小闹了,我们现在要动真格了, 这次我们要写的插件是上个插件的增强版本.而这个插件包含主 ...

  8. jQuery (DOM篇)

    1.DOM节点的创建 创建元素节点: 常见的就是直接把这个节点的结构给通过HTML标记字符串描述出来,通过$()函数处理,$("html结构") $("<div&g ...

  9. Php基础正则表达式篇

    正则表达式通常用来查找和替换字符串,最常用的为验证用户输入的信息格式是否正确,比如邮箱格式.电话格式.身份证等: 什么时候使用正则表达式呢?不是所有的字符操作都用正则就好了,php在某些方面用正则反而 ...

最新文章

  1. ThinkPHP基础概念
  2. R语言使用dplyr包使用group_by函数、summarise函数和mutate函数计算分组下的均值、标准差、样本个数、以及分组均值的95%执行区间对应的下限值和上限值(Calculate CI)
  3. Android -- 带你从源码角度领悟Dagger2入门到放弃(三)
  4. bzoj 4012: [HNOI2015]开店 主席树
  5. Eclipse代码自动对齐方法
  6. 富士施乐3065扫描教程_全面支持IT国产化 富士施乐70款机型获统信UOS兼容认证
  7. 《C++ Primer》14.2.1节练习
  8. Java高级面试题解析(二):百度Java面试题前200页(精选)
  9. POJ 2828 Buy Tickets(单点更新) 详细题解和思路
  10. DBeaver连接GBase数据库
  11. win虚拟光驱怎么做linux,手把手教你用虚拟光驱安装windows10系统的详细步骤
  12. 【leetcode刷题】[简单]427. 建立四叉树(construct quad tree)-java
  13. 软考系统集成项目管理工程师全真模拟题(含答案、解析)
  14. Chrome浏览器书签同步配置方法
  15. 论文复现——CE-FPN: Enhancing Channel Information for Object Detection
  16. [HDOJ 4889] Scary Path Finding Algorithm [SPFA]
  17. webpack看这一篇就够了
  18. SQL中查询MySQL的版本
  19. 构建和管理有效API市场的关键步骤
  20. 树莓派(USB麦克风和麦克风阵列) 录音和播放

热门文章

  1. 《数据库技术原理与应用教程》一3-5信息世界与逻辑模型
  2. Centos设置开机启动Apache和Mysql[总结]
  3. openstack用rdo方式安装时遇到的问题
  4. JS-undefined与null的区别
  5. ubuntu 安装mysql ,postgresql (转)
  6. SVN centos6.3
  7. 向HtmlAgilityPack道歉:解析HTML还是你好用
  8. 静态路由中使用一跳和出接口的区别
  9. 这些年,还是一个人~
  10. 数据库诞生40年,阿里云AWS用技术推动第三次变革