首页 > javascript的正则表达式是出于什么样的考虑而不支持zero-width look behind呢?

javascript的正则表达式是出于什么样的考虑而不支持zero-width look behind呢?

也就是(?<=...)(?<!...)
如果碰到相应的场景有替代的方法吗


自己回答一下吧,在网上搜索以后找到以下两个简单的替代方法

方法一

反转字符串,用lookahead进行搜索,替换以后再倒回来,例如:

String.prototype.reverse = function () {
    return this.split('').reverse().join('');
}
//模拟'foo.bar|baz'.replace(/(?<=\.)b/, 'c') 即将前面有'.'的b换成c
'foo.bar|baz'.reverse().replace(/b(?=\.)/g, 'c').reverse() //foo.car|baz

这个方法最明显的缺陷是无法和lookahead同时使用

方法二

不用零宽断言,自己判断

//模拟'foo.bar|baz'.replace(/(?<=\.)b/, 'c') 即将前面有'.'的b换成c
'foo.bar|baz'.replace(/(\.)?b/, function ($0, $1) {
    return $1 ? $1 + 'c' : $0;    
}) //foo.car|baz
//模拟'foo.bar|baz'.replace(/(?<!\.)b/, 'c') 即将前面没有'.'的b换成c
'foo.bar|baz'.replace(/(\.)?b/, function ($0, $1) {
    return $1 ? $0 : 'c';    
}) //foo.bar|caz

这个方法在一些比较简单的场景下有用,并且可以和lookahead一起用
但也有很多场景无效,例如:

//'tttt'.replace(/(?<=t)t/g, 'x') 结果应该是'txxx'
'tttt'.replace(/(t)?t/g, function ($0, $1) {
    return $1 ? $1 + 'x' : $0;
}) // txtx

参考资料

【热门文章】
【热门文章】