为什么不是';t这个正则表达式在javascript中工作(在perl中工作)

为什么不是';t这个正则表达式在javascript中工作(在perl中工作),javascript,regex,Javascript,Regex,我正在尝试匹配以下字符串 Apache/2.2.6(Unix)mod_ssl/2.2.6 OpenSSL/0.9.7a DAV/2 PHP/5.2.13 使用以下正则表达式 (?:Apache.(\w+))。*(?:OpenSSL.([\w.]+)?*(?:PHP.([\w.]+))? 由于XXX/version对可能不存在,因此我在每个非捕获匹配组之后添加了一个? 但只匹配了第一个版本字符串 var re = /(?:Apache.([\w.]+))?.*(?:OpenSSL.([\w.]+)

我正在尝试匹配以下字符串

Apache/2.2.6(Unix)mod_ssl/2.2.6 OpenSSL/0.9.7a DAV/2 PHP/5.2.13

使用以下正则表达式

(?:Apache.(\w+))。*(?:OpenSSL.([\w.]+)?*(?:PHP.([\w.]+))?

由于
XXX/version
对可能不存在,因此我在每个非捕获匹配组之后添加了一个

但只匹配了第一个版本字符串

var re = /(?:Apache.([\w.]+))?.*(?:OpenSSL.([\w.]+))?.*(?:PHP.([\w.]+))?/;
var captures = re.exec('Apache/2.2.6 (Unix) mod_ssl/2.2.6 OpenSSL/0.9.7a DAV/2 PHP/5.2.13');
console.log (captures);

// captures[1] = '2.2.6'
// captures[2] = undefined
// captures[3] = undefined
有什么想法吗?删除“?”有效,我不知道为什么(与perl一起使用)

编辑

“有效”的有效正则表达式可以是(不带“?”)


(?:Apache.(\w+)。*(?:OpenSSL.([\w.]+).*(?:PHP.([\w.]+))

*是贪婪的,所以我并不奇怪它没有捕获第一组之外的内容。令我惊讶的是,它在任何地方都能奏效。将这些捕获设置为惰性,并将非捕获组和捕获组取消分组,这样似乎可以工作:

(?:Apache.)(\w+)?.*?(?:OpenSSL.)([\w.]+)?.*?(?:PHP.)([\w.]+)?

@anubhava你指的是有效的正则表达式?我指的是像Apache/2.2.6(Unix)mod_ssl/2.2.6 OpenSSL/0.9.7a DAV/2 PHP/5.2.13这样的输入数据的更多示例