Jquery 源码中的 正则表达式 分析

   刚刚整理了一下正则表达式,现在来分析一下Jquery中的正则表达式,就当复习了,理解不正确的,希望路过的高手指点

 

1. quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/                      (I)

 

源码中的解释是:A simple way to check for HTML strings or ID strings (both of which we optimize for),都理解就不翻译了。

 

先由中间的“|”把 (I) 拆成3部分

 

[^<]*(<[\w\W]+>)[^>]*$    (A)

 

#([\w\-]+)$           (B)

 

 ^(?: )            (C) 表示不记录子正则表达式(A)或(B)的匹配结果

 

先分析(A) 式,它可以接着拆成如下

 

[^<]*(<[\w\W]+>)     (D)

 

[^>]*  (E) 非>的字符出现0次或多次

 

$  (F) 结束

 

接着在拆分(D)

 

[^<]*  非<的字符出现0次或多次

 

(<[\w\W]+>)   (G)

 

\w表示单词字符,等同于字符集合[a-zA-Z0-9_],\W表示非单词字符,等效于[^a-zA-Z0-9_],"+"表示出现一次或多次

由此可知(G) 的意思就是 :在“<”和“>”之间有一个或多个字符

 

故(A)的意思就是:没有或多个非“<”字符  +  在“<”和“>”之间有一个或多个字符  +  没有或多个 非“>”的字符。简单的说就是

 

$("<ul>")不识别,而它$(" ul "),$("aaa"),$(" ... ")能识别。

在看(B)第一个字符时“#”,后面紧跟一个或多个[a-zA-Z0-9_-]字符,Jquery中识别ID的

$("#.?")不能识别,$("#aaaaa kkk")也不能识别。

 

 

呵呵,现在明白了(I)的意思了。识别html标签和ID值,你可能要问了$("aaaa"),他也能识别,可它不是html标签啊,这个Jquery下面有

if ( selector.nodeType ) {
            this.context = this[0] = selector;
            this.length = 1;
            return this;
        }

中作了判断。

 

关于 nodeType 的介绍,Google介绍的不少。

 

2. isSimple = /^.[^:#\[\.,]*$/,                     (II )

源码中的解释是 : Is it a simple selector

 

这个好理解,还是拆开来说,

^.(B)$                                     (A)

 

[^:#\[\.,]*                     (B)

 

(B)的意思是说 非“:”,非“#”,非“[”,非“.”的字符或“,”没有或出现多次

 

所以(II)的意思就是说:它匹配以一个除了换行字符的字符开始 ,以没有或者多个非“:”,非“#”,非“[”,非“.”的字符结束。

呵呵,由此看出,$(" "),它是匹配的。 isSimple 在源码有只有一个地方用它了。Jquery API中filter 和not方法用isSimple,

它在Jquery中的作用现在还不明白,待研究。

 

3. rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/             (III)

源码中的解释是 : Match a standalone tag

 

现在拆分它 :

 

<(\w+)\s*\/?>                  (A)

 

(?:<\/\1>)?               (B)

 

现在分析(A)

<                          就是 “<”

(\w+)                    一个或多个单词字符 [a-zA-Z0-9_]

\s*                       没有或多个空白字符

\/?                       没有或一个“/”

>                        就是“>”

 

现在分析(B),还是拆分它

 

<\/\1>              (C) 意思是:一个“</” 后跟和(\w+)一样的值 在加上 ">"

 

(?:(C))?            (D)没有或一个(B)

 

现在明白的,就是和源码中解释的一样,匹配独立的标签。

 

4. 先到这,剩下的后面再说。

 

// JSON RegExp
    rvalidchars = /^[\],:{}\s]*$/,
    rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
    rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
    rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,

    // Useragent RegExp
    rwebkit = /(webkit)[\/]([\w.]+)/,
    ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
    rmsie = /(msie) ([\w.]+)/,
    rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,

 

终于扫除了看Jquery源码的有一个拦路虎啊。嘿嘿

 

 

这里有篇相关的文章:
地址:http://jmrware.com/articles/2010/jqueryregex/jQueryRegexes.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值