正则表达式:使用正向后查找锚点

3
正向回顾后表达式锚定在开头似乎无法工作。有人知道为什么吗?
例如,下面的代码返回null。

const str = "foo:25"
const regex = new RegExp(/^(?<=foo:)\d+/);
console.log(regex.exec(str));

编辑:我知道如何让它工作。我正在问为什么这个特定的正则表达式不匹配。


1
你的正则表达式询问字符串 foo 是否可以在字符串开始之前匹配。这显然是不可能的,因此只能在Milliways工作。 - Tim Pietzcker
2个回答

3
使用正则表达式^(?:(?<=^)|(?<=foo:))\d+来修复问题。这个模式使用了一个非捕获组,它包含了两个选项:如果当前位置是字符串的开头,则匹配字符串的开头;否则,如果当前位置左侧有foo:,则匹配当前位置。
const regex = new RegExp(/(?<=^foo:)\d+/);

这里,(?<=^foo:) 向后查找检查字符串开头的 foo,但由于 ^ 不再是 消耗 模式的一部分,因此会测试字符串中的每个位置。
在JS中,为了更好地跨浏览器移植性,您最好使用捕获组而不是正向后查找(并且还可以直接使用正则表达式字面量表示法,无需使用构造函数表示法:/.../)。

var str = "foo:25"
var regex = /^foo:(\d+)/;
console.log(regex.exec(str)[1]);


2
^应该放在foo之前。例如:

const str = "foo:25"
const regex = new RegExp(/(?<=^foo:)\d+/);
console.log(regex.exec(str));


我已经尝试过这个。但是你能解释一下为什么我的正则表达式不起作用吗? - gawicks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接