【问题标题】:Regex: Negative lookahead with capturing group not from beginning正则表达式:不是从一开始就捕获组的负前瞻
【发布时间】:2015-04-14 11:38:36
【问题描述】:

我已经在 J​​avascript 中实现了一个正则表达式,它可以匹配来自 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多