有人能告诉我jQuery rts正则表达式中第二个捕获组的目的吗?

时间:2010-09-22 15:50:45

标签: javascript jquery regex

Jeff Roberson's jQuery Regular Expressions Review中,他建议将jQuery's ajax.js中的rts正则表达式从/(\?|&)_=.*?(&|$)/更改为/([?&])_=[^&\r\n]*(&?)/。在这两个版本中,第二个捕获组的目的是什么?该代码使用新的随机时间戳替换当前的随机时间戳:

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);

有人可以解释第二个捕获组的目的吗?

3 个答案:

答案 0 :(得分:0)

它是在URL上的查询字符串中选取下一个分隔符,以便它仍然可以作为查询字符串正常工作。因此,如果网址是

http://foo.bar/what/ever?blah=blah&_=12345&zebra=banana
然后第二组拿起“&”在“斑马”之前。

顺便说一下,这是一篇很棒的博客文章,每个人都应该阅读它。

编辑 - 现在我想起来了,我不知道为什么有必要为替换第二个分隔符而烦恼。在“固定”表达式中,贪婪的*将获取整个参数值,并在分隔符(或字符串的末尾)处停止。

答案 1 :(得分:0)

我认为你是对的。原版中需要它,因为匹配&符号或字符串结尾是.*?知道何时停止的方式。在杰夫的版本中,不再需要。

答案 2 :(得分:0)

作为文章的作者,我无法告诉你第二个捕获组的原因。我对本文的意图是采用现有的正则表达式并简单地使它们更有效 - 即它们都应该匹配相同的文本 - 只是更快地完成它。不幸的是,我没有时间深入研究代码,以确切了解每个代码的使用方式。我认为这个的捕获组是有原因的所以我没有弄乱它。