2017-07-27 4 views
2

私はjavascriptでこれを行う正しい正規表現を把握しようとしています。 PCREでは、これは私が欲しいものを正確に行います。javascript regex negative look-behind

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

目標:

  • 私はスラッシュが付いていない値、例えばKB を持っている場合、それはよ内の番号と一致します。
  • その値は接頭辞されている場合は、それが一致しませんスラッシュ例えば: これはPCREで動作している間、それはJavaScriptで動作しませんようにそれが原因構文に見えますがhttp://someurl.com/info/KB12345

否定の:

(?<!\/) 

私はこれをregex101で把握しようとしていますが、まだ運がありません。任意のアイデアや、純粋なregexのjavascriptに相当するものについての提案ですか?

私はそこに負の先読みだが、私はそれを把握するように見えることはできません見た:

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

答えて

3

次の正規表現を使用してみてください正しいテキストと一致するように:

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

regex demo

詳細参照してください:

  • (?:^|[^\/]) - 文字列の先頭または/
  • kb以外の文字 - 文字列リテラルkb
  • ([0-9]+) - グループ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);