【发布时间】:2015-04-14 11:38:36
【问题描述】:
我已经在 Javascript 中实现了一个正则表达式,它可以匹配来自 Safari 而不是来自 iPad 的 navigator.userAgent 字符串:
/^(?!.*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”,但它返回数组内的第二个元素。
有谁知道我怎样才能在唯一的正则表达式中完成此操作?
提前致谢。
【问题讨论】:
-
你能解释一下这个
expression in Javascript which can match a navigator.userAgent string from Safari and not from iPad:吗? -
@AvinashRaj Safari 的 navigator.userAgent 包含 PC 版本和 iPad 版本的“Safari”,但只有 iPad 版本具有“Mobile”或“iPad”子字符串。所以我认为区分它们的最简单方法是在定义 Safari for PC 模式时,使用 Mobile 或 iPad 删除所有结果(我也可以编写 /^(?!.*Mobile).*Safari/i )
-
@IsmaelMiguel 这行不通,至少在 PC 版 Safari 中是这样。我刚刚在控制台中测试过了。
-
那么你的正则表达式中有一个严重的错误。使用
/(?:Mobile)?\s+(Safari)/i。 -
都返回 ["Safari", "Safari"]
标签: javascript regex regex-negation negative-lookahead