Javascript向后查找

4

我想在Javascript中模拟一个向后查找的外观。

我希望匹配字符串"object.all"但不匹配"object.call"。 我已经尝试过:

new RegExp('(?!(\\.))all')

但是这两个例子都匹配成功了,我想要的是向后查找以测试是否有一个 . (点) 刚好在 all 的后面,有人能解释一下我的正则表达式哪里出错了吗?

提前感谢。


这个是正确的:

'object.all'.replace(new RegExp('(?!(\\.))all'), 'foo') 
// => object.foo

对于这个问题,我希望结果是 "object.call":

'object.call'.replace(new RegExp('(?!(\\.))all'), 'foo')
// => object.cfoo

4
你有没有查看过这个网站?请检查一下。 - Martin Ender
@JohnnyMopp 因为我像这样使用它:"object.call".replace(new RegExp('(?!(\\.))all'), 'foo') - julesbou
@m.buettner,你的链接看起来好复杂啊 :) - julesbou
@jules 我已更新了我的答案 - 对于那里的混淆感到抱歉。 - Jay
正则表达式的“后行断言”是在2018年的规范中添加的。它们可以在Chrome中使用,但在Firefox中不可用。 - Lonnie Best
2个回答

0

虽然这看起来很复杂,但可以完成工作:

function replaceAll(string, replacement) {
  var output = string.replace(/(\.)?all/g, function($0, $1) {
    return $1 ? $1 + replacement : $0;
  });
  return output;
}

var test1 = replaceAll("object.all", "foo");
var test2 = replaceAll("object.call", "foo");

console.log(test1); // object.foo
console.log(test2); // object.call

我曾经在今年早些时候的一段代码中使用了@m.buettner在评论中链接的文章(JavaScript中模拟后顾之约)。


我已经更新了我的回答,以反映您在问题中提供的新示例。 - Jay

0
问题在于它仍然是一个前瞻。因此,它正在检查点是否存在于与“a”相同的位置,而不是在其后面的位置。

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