这个正则表达式部分添加了什么?

pim*_*vdb 8 javascript regex jquery

我在jQuery源代码中遇到了这个正则表达式:

...
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
...
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它相当复杂.我对第二部分背后的原因特别感兴趣:

(?:.*? rv:([\w.]+))?
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,但我无法弄清楚正则表达式的这部分是什么.

(?:)      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
Run Code Online (Sandbox Code Playgroud)

特别是,最后?一点对我来说没有多大意义.如果存在或不存在由第二部分定义的子字符串,则整个第二部分匹配.通过一些反复试验,正则表达式似乎与以下内容不同:

/(mozilla)/
Run Code Online (Sandbox Code Playgroud)

有人可以说明正则表达式的第二部分应该做什么吗?它有什么约束; 什么字符串失败通过/(mozilla)/或反过来?

Jac*_*ers 4

这两个正则表达式将匹配相同的字符串,但会在其捕获组中存储不同的信息。

对于字符串:mozilla asdf rv:sadf

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

/(mozilla)/
$0 = 'mozilla'
$1 = 'mozilla'
$2 = ''
Run Code Online (Sandbox Code Playgroud)