也就是(?<=...)和(?<!...) 如果碰到相应的场景有替代的方法吗
(?<=...)
(?<!...)
自己回答一下吧,在网上搜索以后找到以下两个简单的替代方法
反转字符串,用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
参考资料
自己回答一下吧,在网上搜索以后找到以下两个简单的替代方法
方法一
反转字符串,用lookahead进行搜索,替换以后再倒回来,例如:
这个方法最明显的缺陷是无法和lookahead同时使用
方法二
不用零宽断言,自己判断
这个方法在一些比较简单的场景下有用,并且可以和lookahead一起用
但也有很多场景无效,例如:
参考资料