search

Home  >  Q&A  >  body text

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

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

巴扎黑巴扎黑2900 days ago298

reply all(1)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 14:36:58

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

    方法一

    反转字符串,用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
    

    参考资料

    reply
    0
  • Cancelreply