Javascript正则表达式负面后瞻

时间:2017-07-27 09:37:29

标签: javascript regex regex-negation

我正在尝试找出正确的正则表达式,以便在javascript中执行此操作。在pcre中,这正是我想要的:

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

目标:

  • 如果我有一个没有前向斜杠前缀的值,例如KB 12345 ,那么它将匹配其中的数字。
  • 如果该值以正斜杠为前缀,则不匹配,例如: http://someurl.com/info/KB12345

然而,看起来虽然这在pcre中起作用,但由于否定的语法,它在javascript中不起作用:

(?<!\/)

我一直试图在regex101中解决这个问题,但还没有运气。关于javascript中纯正则表达式的等价物的任何想法或建议?

我看到有一个负面的预测,但我似乎无法弄明白:

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

2 个答案:

答案 0 :(得分:4)

使用以下正则表达式匹配正确的文本:

/(?:^|[^\/])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+"'") };
}

答案 1 :(得分: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);