刚刚整理了一下正则表达式,现在来分析一下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