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 正则表达式负回顾的主要内容,如果未能解决你的问题,请参考以下文章
偷学Python第三十一天:Python正则表达式的语法以及re模块的使用