2010-09-22 48 views
1

Jeff Roberson's jQuery Regular Expressions Review中,他建議將jQuery's ajax.js中的rts正則表達從/(\?|&)_=.*?(&|$)/更改爲/([?&])_=[^&\r\n]*(&?)/。在這兩個版本中,第二個捕獲組的目的是什麼?該代碼做一個新的隨機時間戳替換當前隨機時間戳:有人能告訴我第二個捕獲組在jQuery rts正則表達式中的用途嗎?

var ts = jQuery.now(); 
// try replacing _= if it is there 
var ret = s.url.replace(rts, "$1_=" + ts + "$2"); 

難道不是隻替換它匹配呢?我認爲這是一樣的:

var ret = s.url.replace(/([?&])_=[^&\r\n]*/, "$1_=" + ts); 

有人可以解釋第二捕獲組的目的是什麼?

回答

0

它是在URL上的查詢字符串中選取下一個分隔符,以便它仍然可以作爲查詢字符串正常工作。因此,如果該URL是

http://foo.bar/what/ever?blah=blah&_=12345&zebra=banana 

則第二組拿起「斑馬線」前的「&」。

這是一個很棒的博客文章,每個人都應該閱讀它。

編輯 —現在,我想想,我不知道爲什麼它是必要的更換是第二限定打擾。在「固定」表達式中,那個貪婪的*將拿起整個參數值,並且無論如何都停在分隔符(或字符串的結尾)。

0

我認爲你是對的。它在原文中是需要的,因爲匹配&符或字符串結尾是.*?知道何時停止。在傑夫的版本中,這不再是必要的。

0

作爲文章的作者,我無法告訴你第二捕獲組的原因。我對這篇文章的意圖是採取現有的正則表達式,並簡單地使它們更有效率 - 即它們應該都匹配相同的文本 - 只是更快。不幸的是,我沒有時間深入研究代碼,以確切瞭解每個人如何使用它們。我認爲這個捕獲組在那裏是有原因的,所以我沒有惹它。