XRegExp没有后视?

时间:2013-08-09 22:47:50

标签: javascript regex xregexp

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

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

一些外观逻辑 http://regex101.com/r/xD0xZ5 使用XRegExp

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高级谢谢!

2 个答案:

答案 0 :(得分:4)

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

  

Lookahead断言已成为JavaScript正则表达式的一部分   语法从一开始。他们的对手,后视断言,是   终于在谷歌Chrome 62中introduced ... *了   资料来源: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>

但是,没有其他浏览器支持lookbehind断言 - 甚至不是node.js,它基于v8(使用node v9.7.1/v8 6.2.414.46测试过,但我希望它将在即将发布的节点版本中添加。)

希望其他供应商很快就会推出。

答案 1 :(得分:1)

可以使用non-capturing groups,例如

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

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

有关正则表达式的详细信息,请view what it matches here