Javascript 正则表达式负回顾

Posted

技术标签:

【中文标题】Javascript 正则表达式负回顾【英文标题】:Javascript regex negative look-behind 【发布时间】:2018-01-02 22:51:10 【问题描述】:

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

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

目标:

如果我有一个不带正斜杠前缀的值,例如 KB12345,它将匹配其中的数字。 如果该值带有正斜杠前缀,它将不匹配,例如: http://someurl.com/info/KB12345

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

(?<!\/)

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

我看到有一个负面的前瞻,但我似乎无法弄清楚:

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

【问题讨论】:

【参考方案1】:

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

/(?:^|[^\/])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】:

试试这个

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);

【讨论】:

以上是关于Javascript 正则表达式负回顾的主要内容,如果未能解决你的问题,请参考以下文章

js正则

偷学Python第三十一天:Python正则表达式的语法以及re模块的使用

偷学Python第三十一天:Python正则表达式的语法以及re模块的使用

Javascript如何判断一个变量是数字类型?

原生JavaScript常用的正则表达式

day17-JavaScript正则表达式