为什么这个正则表达式在javascript中工作(在perl中工作)

时间:2015-09-02 15:46:33

标签: 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.]+))?.*(?: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.]+))

1 个答案:

答案 0 :(得分:2)

。*是贪婪的,所以我并不感到惊讶它没有超越第一组。让我感到惊讶的是,它在任何地方都有效。让那些全能懒惰并取消对非捕获和捕获组的分组,它似乎有效:

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