JavaScript负面的后视问题

时间:2012-02-11 00:13:40

标签: javascript regex

我有一些JavaScript在Amazon链接中查找Amazon ASIN,例如

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

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

但是,我不希望它与匹配的艺术家链接相匹配:

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

所以我需要排除斜杠前面有'/ e'和10个字符的字母数字代码的任何链接。我认为以下内容会这样做:(?<!/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/

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

([A-Z0-9]{10})在输入的反方向上同样有效,所以你可以

  1. 反转字符串,
  2. 使用积极的前瞻,
  3. 将其反转。

答案 2 :(得分:0)

您需要使用前瞻来过滤/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);
});