Regex:从一开始就对捕获组进行了负面展望

Regex: Negative lookahead with capturing group not from beginning

本文关键字:一开始 Regex      更新时间:2023-10-12

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

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

我的问题是,当进行匹配时,它会返回整个字符串:

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"]

我想在最后一行只返回:

["Safari"]

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

有人知道我如何在一个唯一的正则表达式中实现这一点吗?

提前谢谢。

我没有找到只返回["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