4

我需要在 JavaScript 中使用正则表达式的lookbehind,所以发现 Simulating lookbehind in JavaScript (take 2)。另外,我发现作者 Steven Levithan 是开发XRegExp的人。

我 git 克隆了 XRegExp 3.0.0-pre,并进行了测试

一些使用 XRegExp 的后视逻辑 http://regex101.com/r/xD0xZ5

var XRegExp = require('xregexp');
console.log(XRegExp.replace('foobar', '(?<=foo)bar', 'test'));

它似乎不起作用;

$ node test
foobar

我想念什么?谢谢。

编辑:我的目标是

(?<=foo)[\s\S]+(?=bar)

http://regex101.com/r/sV5gD5

(EDIT2链接错误并已修改)

回答:

var str = "fooanythingbar";
console.log(str);
console.log(str.replace(/(foo)(?:[\s\S]+(?=bar))/g, '$1test'));

//footestbar

感谢@Trevor Senior 谢谢!

4

2 回答 2

4

我想提供有关事态的最新信息。

前瞻断言从一开始就是 JavaScript 正则表达式语法的一部分。他们的对应物,lookbehind assertions,终于被引入了...... *在谷歌浏览器 62 中
来源:https ://developers.google.com/web/updates/2017/07/upcoming-regexp-features

如果您使用Chrome 62+、v8 6.2.414运行它,您将获得预期的结果:footest
- 独立于XRegex

 
var x = XRegExp('(?<=foo)bar', 'g');
console.log(XRegExp.replace('foobar', x, 'test'));

console.log("foobar".replace( new RegExp('(?<=foo)bar',"g"),"test"));
<script src="https://unpkg.com/xregexp/xregexp-all.js"></script>

然而,目前还没有其他浏览器支持后向断言——甚至基于 v8 的 node.js 也不支持(使用node v9.7.1/v8 6.2.414.46进行测试,但我希望它将在即将发布的 node 版本中添加。)

希望其他供应商能尽快跟进。

于 2018-04-19T21:14:04.570 回答
1

可以为此使用非捕获组,例如

$ node
> 'foobar'.replace(/(foo)(?:bar)/g, '$1test')
'footest'

String.replace的第二个参数中,特殊符号$1引用了第一个捕获组,(foo)在这种情况下是。通过使用$1test,可以将其$1视为第一个匹配组的占位符。展开后,变成'footest'.

有关正则表达式的更多详细信息,请在此处查看它匹配的内容

于 2013-08-09T23:00:05.140 回答