jQuery 之正則表達式篇

從本文開始,我將陸續的更新關於jQuery源代碼的博客。首先,jQuery源代碼分析一直是個人一個計劃和追求。查看jQuery源代碼,探索大牛們深邃的思想,精神的碰撞。Google 搜索不難發現,探索jQuery 的人不在少數,因而可知,jQuery總體的架構,模式建立多麼的回味無窮。本系列屬於本人原創,本着低調,詳細的態度,開始個人jQuery 之旅。本次閱讀 jQuery 1.9.1。javascript

正則表達式解析css

 一:想看源碼,就要搞懂jquery裏面的正則。在沒看源碼以前,我就認爲,jquery離不開正則。下面的jQuery 用到的全局標量,全是正則啊。html

爲了咱們能看懂後續的代碼,先要過了基本功。java

二:正則,基本的不講了,主要講一些比較難的括號/()/匹配以及他的經常使用搭配 ?,?:,?!。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。這就是非貪婪匹配,能夠這麼理解爲去匹配項的最小匹配項。實例結果以下json

      

  可是有的時候非貪婪模式與咱們期待的並不同。好比/a+?d/是匹配一個或多個連續的a和一個b,匹配字符爲aaaaad,按照非貪婪匹配,你指望的是匹配最後的一個a和d,實際上所有匹配。這個貪婪匹配效果同樣。如圖:數組

      

    

  2.選擇,分組和引用。架構

    這就是要重點談的()的做用了。ide

    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,表示有連接符「-」的數字或字符

    

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

相關文章
相關標籤/搜索