XRegExp no look-behind?

六月ゝ 毕业季﹏ 提交于 2020-01-01 06:14:10

问题


I need to use lookbehind of regex in JavaScript, so found Simulating lookbehind in JavaScript (take 2). Also, I found the author Steven Levithan is the one who developed XRegExp.

I git cloned XRegExp 3.0.0-pre, and tested

some lookbehind logic http://regex101.com/r/xD0xZ5 using XRegExp

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

It seems not working;

$ node test
foobar

What do I miss? Thanks.

EDIT: My goal is something like

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

http://regex101.com/r/sV5gD5

(EDIT2 the link was wrong and modifed)

Answer:

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

//footestbar

Credit goes to @Trevor Senior Thanks!


回答1:


It is possible to use non-capturing groups for this, e.g.

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

In the second parameter of String.replace, the special notation of $1 references the first capturing group, which is (foo) in this case. By using $1test, one can think of $1 as a placeholder for the first matching group. When expanded, this becomes 'footest'.

For more in depth details on the regular expression, view what it matches here.




回答2:


I want to give an update on the state of affairs.

Lookahead assertions have been part of JavaScript’s regular expression syntax from the start. Their counterpart, lookbehind assertions, are finally being introduced ... *in Google Chrome 62
Source: https://developers.google.com/web/updates/2017/07/upcoming-regexp-features

If you run this in with Chrome 62+, v8 6.2.414 you will get the expected result: footest
- independent of 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>

However, no other browser supports lookbehind assertions yet - not even node.js, which is based on v8 (tested with node v9.7.1/v8 6.2.414.46, but I expect it will be added in upcoming node releases.)

Hopefully, other vendors will follow soon.



来源:https://stackoverflow.com/questions/18156794/xregexp-no-look-behind

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!