2012-02-11 31 views
3

我有一些JavaScript,看起來一個Amazon鏈接中亞馬遜ASINs,例如JavaScript的負回顧後問題

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

爲此,我使用下面的正則表達式:/([A-Z0-9]{10})

然而,我不希望它匹配看起來像藝術家鏈接:

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

所以我需要排除任何鏈接,其中t這裏是斜槓前面的'/ e'和10個字符的字母數字代碼。我認爲以下內容可以做到這一點:(?<!/e)([A-Z0-9]{10}),但事實證明,負面的lookbehinds在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/ 
+1

是的,負向lookbehinds不受支持。 – 2012-02-11 00:19:28

+0

JS中並沒有直接支持負向lookbehinds,但有一些非常簡單的方法來實現它們的邏輯。 [這個問題](https://stackoverflow.com/questions/641407/javascript-negative-lookbehind-equivalent)是這種事情的主要問題。我在其他地方給出了[更全面的答案](https://stackoverflow.com/questions/35142364/regex-negative-lookbehind-not-valid-in-javascript/35143111#35143111)。 – 2016-02-09 02:00:23

回答

3

你的情況,像這樣的表達會工作:

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

不錯。也許'(^ [\ s \ S]?|(?!\/e)[\ s \ S] {2})'可以匹配輸入開頭和行首。 – 2012-02-11 18:51:01

2

([A-Z0-9]{10})將平等合作以及其輸入的反轉,所以你可以

  1. 扭轉串,
  2. 使用正向前查找,
  3. 扭轉回來。
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); 
});