【问题标题】:JavaScript negative lookbehind issueJavaScript 负面回溯问题
【发布时间】:2012-03-03 10:37:17
【问题描述】:

我有一些 JavaScript 可以在亚马逊链接中查找亚马逊 ASIN,例如

http://www.amazon.com/dp/B00137QS28

为此,我使用以下正则表达式:/([A-Z0-9]{10})

但是,我不希望它与看起来像这样的艺术家链接相匹配:

http://www.amazon.com/Artist-Name/e/B000AQ1JZO

所以我需要排除在斜线和 10 个字符的字母数字代码之前有“/e”的任何链接。我认为以下方法可以做到这一点:(?<!/e)([A-Z0-9]{10}),但事实证明,负面的后视在 JavaScript 中不起作用。那正确吗?还有另一种方法可以做到这一点吗?

任何帮助将不胜感激!

作为旁注,请注意有很多亚马逊链接格式,这就是为什么我想列入黑名单而不是白名单的原因,例如,这些都是同一个页面:

http://www.amazon.com/gp/product/B00137QS28/
http://www.amazon.com/dp/B00137QS28
http://www.amazon.com/exec/obidos/ASIN/B00137QS28/
http://www.amazon.com/Product-Title-Goes-Here/dp/B00137QS28/

【问题讨论】:

  • 是的,不支持负面的后视。
  • 在 JS 中不直接支持负向回溯,但是有一些相当简单的方法可以实现它们的逻辑。 This question 是这类事情的主要问题。我在别处给了a more comprehensive answer

标签: javascript regex


【解决方案1】:

在你的情况下,这样的表达式会起作用:

/(?!\/e)..\/([A-Z0-9]{10})/

【讨论】:

  • 不错。也许(^[\s\S]?|(?!\/e)[\s\S]{2}) 可以匹配输入的开头和行的开头附近。
【解决方案2】:

([A-Z0-9]{10}) 在其输入的反面同样可以正常工作,因此您可以

  1. 反转字符串,
  2. 使用积极的前瞻,
  3. 把它倒过来。

【讨论】:

    【解决方案3】:

    您需要使用前瞻功能将/e/* 过滤掉。然后从每个匹配项中删除前导 /e/

    var source; // the source you're matching against the RegExp
    var matches = source.match(/(?!\/e)..\/[A-Z0-9]{10}/g) || [];
    var ids = matches.map(function (match) {
      return match.substr(3);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 2018-03-22
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2012-07-04
      相关资源
      最近更新 更多