jQuery 之正則表達式篇


從本文開始,我將陸續的更新關於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,表示有鏈接符“-”的數字或字符

    

總結:今天這部分算是過關了。分析還要繼續

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM