2017-07-27 88 views
2

我想弄清楚正確的正則表達式來做到這一點的JavaScript。在PCRE,這不正是我想要的:Javascript正則表達式負面後顧

/^.*(?<!\/)kb([0-9]+).*$/im 

目標:

  • 如果我有沒有用斜槓前綴的值,如KB ,它會匹配內的數字。
  • 如果該值與前綴正斜槓它不會匹配,如: http://someurl.com/info/KB12345

但是它看起來像,而這部作品在PCRE,它不會在JavaScript的工作,由於語法的否定:

(?<!\/) 

我一直在試圖找出這regex101,但沒有運氣呢。任何想法或建議什麼在javascript中的純正則表達式相當於什麼?

我看到有一個負前瞻,但我似乎無法弄清楚:

/^.*(?!\/KB)kb([0-9]+).*$/im 

回答

3

使用下面的正則表達式匹配正確的文字:

/(?:^|[^\/])kb([0-9]+)/i 

regex demo

詳細

  • (?:^|[^\/]) - 字符串或比/
  • kb以外的字符的開始 - 一個字符串kb
  • ([0-9]+) - 第1組配套1更多數字。

var ss = ["If I have a value that isn't prefixed with a forward-slash, e.g KB12345, it'll match the number within.","If that value is prefixed with a forward-slash it won't match, e.g: http://someurl.com/info/KB12345"]; 
 
var rx = /(?:^|[^\/])kb([0-9]+)/i; 
 
for (var s of ss) { 
 
var m = s.match(rx); 
 
if (m) { console.log(m[1], "found in '"+s+"'") }; 
 
}

+2

謝謝!非常感謝解釋作爲一個學習點! – Tiago

2

試試這個

a = /^(?!\/KB)kb([0-9]+)$/i.test('KB12345') 
 
b = /^(?!\/KB)kb([0-9]+)$/i.test('http://someurl.com/info/KB12345') 
 
c = /^(?!\/KB)kb([0-9]+)$/i.test('/KB12345') 
 

 
console.log(a); 
 
console.log(b); 
 
console.log(c);