2011-08-19 47 views
8

我碰到這個正則表達式在jQuery的源代碼來了:這個正則表達式部分添加了什麼?

... 
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, 
... 

我想知道爲什麼它是相當複雜的。我在第二部分,背後的原因特別感興趣:

(?:.*? rv:([\w.]+))? 

我做了一些研究,但我無法弄清楚什麼正則表達式,這部分增加。

(?:)  to match but not capture 
.*?  any amount of any character 
rv:  something literal 
([\w.]+) one or more word characters or a dot 
?   appear 0 or 1 time 

特別是,最後的?對我沒有多大意義。如果有或沒有第二部分定義的子字符串,整個第二部分匹配。隨着一些試驗和正則表達式似乎錯誤不會對剛剛有所不同:

/(mozilla)/ 

有人能闡明什麼正則表達式的第二部分是應該做一些輕?它是什麼限制;什麼字符串失敗,通過/(mozilla)/或其他方式?

+0

我懷疑這是通過將其放入自己的用戶代理字符串來解決某些瀏覽器Mozilla的僞裝。 –

+0

你能提供更多的上下文嗎?這是一個jQuery插件的一部分?如果是這樣,哪一個?知道這段代碼出現的位置可能會爲作者想要這種特定模式,以及模式的作用提供一些信息。 – jefflunt

+0

@Rafe Kettler:我不確定我是否正確理解你。正則表達式添加什麼來防止僞造者? – pimvdb

回答

4

這兩個正則表達式匹配相同的字符串,但會在其捕獲組中存儲不同的信息。

的字符串:mozilla asdf rv:sadf

/(mozilla)(?:.*? rv:([\w.]+))?/ 
$0 = 'mozilla asdf rv:sadf' 
$1 = 'mozilla' 
$2 = 'sadf' 

/(mozilla)/ 
$0 = 'mozilla' 
$1 = 'mozilla' 
$2 = '' 
1

(?:.*? rv:([\w.]+))內部的([\w.]+)正在捕獲,所以也許這個正則表達式被用來獲得過去的修訂號(但似乎目前jquery只檢查正則表達式匹配)。

2

首先,我想澄清的區別:

.*? - non-greedy match 
.* - greedy match 

非貪婪的匹配可能的最小字節數(給定的搜索字符串的其餘部分),以及貪婪的人會最匹配。

給出字符串:

mozilla some text here rv:abc xyz 

正則表達式將返回兩個 'Mozilla瀏覽器' 和 'ABC'。但是如果'rv:'不存在,正則表達式仍然會返回'mozilla'。

+0

確實如此,但它們通常分別被稱爲「非貪婪」和「貪婪」。 –

+0

是的。我的記憶有點有趣。我會編輯。 –

0

(PAT),用於匹配一個充滿包含形成圖案的分隔符。 (?:pat)是上面的否定,就像字符集括號[^]是[]的否定。在JavaScript中,否定發生在 。匹配任何字符,*是匹配的量詞,並且可以在更新的正則表達式引擎中寫爲{0,}(但這三個附加字符可能會導致鍵盤早期死亡!) ?冗餘匹配量詞:可以匹配零個或一個時間 RV:([\ W] +)....字面RV

另一個子匹配,也可以在父匹配 內匹配零次或一次)? [\ w。] ...字符集,帶有轉義的w「\ w」:任何字母數字字符,又名[a-zA-Z0-9_]後面跟隨一個文字點和每個匹配量詞+,可能會發生一次或多次

要反向工程模式匹配的含義:在文本編輯器中從左向右進行評估,然後用想到的每個子表達式匹配的隨機文字替換字母。 然後退後一步,思考正則表達式可能的用途。

+1

請充分利用SO的[代碼格式](http://stackoverflow.com/editing-help#code)功能;就像現在一樣,你的答案几乎是不可讀的。 –

+1

答案還包含一些錯誤,如:** 1。**'(pat)'是一個捕獲組; ** 2(**:pat)'是一個*非捕獲*組,不是一個負面的前瞻,因爲你似乎暗示着(這將是'(?!pat)'); ** 3 **在幾乎所有的正則表達式中''*'相當於{0,}' - 年齡與它無關; ** 4。**第一個'?'使前面的'*'不情願(不重複); ** 5. ['w。]'相當於'[A-Za-z0-9 _。]'(即匹配單詞字符*或點*,而不是*後跟一個點*,如你所說。 –

2

注意:我現在注意到這個答案可能有點超出範圍。我仍然會留下它作爲進一步的信息,但如果您認爲它超出範圍,只是評論,我會刪除它。


@arnaud是對的,它是獲取版本。 Here is the code其中表達式使用:

uaMatch: function(ua) { 
    ua = ua.toLowerCase(); 

    var match = rwebkit.exec(ua) || 
       ropera.exec(ua) || 
       rmsie.exec(ua) || 
       ua.indexOf("compatible") < 0 && rmozilla.exec(ua) || 
       []; 

    return { browser: match[1] || "", version: match[2] || "0" }; 
}, 

你可以看到,如果發現0如果不是函數返回的版本。這對於某些瀏覽器可能是必需的,或者僅作爲開發者的附加信息提供。

的函數被調用here

browserMatch = jQuery.uaMatch(userAgent); 
if (browserMatch.browser) { 
    jQuery.browser[ browserMatch.browser ] = true; 
    jQuery.browser.version = browserMatch.version; 
} 
相關問題