我试图匹配以下字符串,
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.]+))
答案 0 :(得分:2)
。*是贪婪的,所以我并不感到惊讶它没有超越第一组。让我感到惊讶的是,它在任何地方都有效。让那些全能懒惰并取消对非捕获和捕获组的分组,它似乎有效:
(?:Apache.)(\w+)?.*?(?:OpenSSL.)([\w.]+)?.*?(?:PHP.)([\w.]+)?