正则表达式:从一开始就对捕获组进行负面预测

Regex: Negative lookahead with capturing group not from beginning

我在 Javascript 中实现了一个正则表达式,它可以匹配来自 Safari 而不是来自 iPad 的 navigator.userAgent 字符串:

/^(?!.*Mobile).*Safari/i

我的问题是,在进行匹配时 return 是整个字符串:

var pattern = /^(?!.*Mobile).*Safari/i;

var pc = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2";

var ipad = "Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25";

ipad.match(pattern); // Returns null
pc.match(pattern);   // Returns ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari"]

最后一行我想要的只是return:

["Safari"]

我做了一些研究,我知道你可以通过 (?:term) 或 (?is:term) 从正则表达式中删除捕获组的性质,但它甚至不会用负前瞻编译 (至少在 Safari 中)。我还尝试在匹配结束时用方括号捕获 "Safari",但它 return 是数组中的第二个元素。

有谁知道我怎样才能在一个正则表达式中完成这个?

提前致谢。

我没有找到只返回 ["Safari"] 的方法,但我发现为了识别浏览器,这是我的目标,使用模式对象中的 test() 方法要好得多。

一些示例:

/^(?!.*(ipad|chrome)).*safari.*$/i.test(navigator.userAgent); // true for Safari
/^(?!.*(ipad|chrome)).*windows.*safari.*$/i.test(navigator.userAgent); // true only for Safari in Windows
/iPad/i.test(navigator.userAgent); // true only for iPad