JS中的后向支持是什么?如何更换?

时间:2019-02-10 13:11:52

标签: javascript regex negative-lookahead negative-lookbehind

我有一个字符串,我想替换所有未跟随/跟随的所有“ i”,然后将其替换为“ z”。我知道往前和往后都是负面的。

结果应为:

i => z
iki => zkz
iiki => iikz
ii => ii
iii => iii

我试图用这个:

/(?<!i)i(?!i)/gi

它失败并抛出错误:Invalid regex group

/i(?!i)/gi

可以正常工作,但是在其中匹配第二个“ i”:“ ii”。

还有其他方法吗?

如果有,对JS中的lookbehind的支持是什么?

3 个答案:

答案 0 :(得分:5)

在您的情况下,您实际上不需要后顾之忧:

'iiki'.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z')

您可以仅使用函数作为替换部分并测试匹配字符串的长度。

这是您所有的测试用例:

function test(input, expect) {
  const result = input.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z');
  console.log(input + " => " + result + " // " + (result === expect ? "Good" : "ERROR"));
}

test('i', 'z');
test('iki', 'zkz');
test('iiki', 'iikz');
test('ii', 'ii');
test('iii', 'iii');

答案 1 :(得分:2)

JavaScript正则表达式后面的内容是相当新的。在撰写本文时,它是only supported in V8(在Chrome,Chromium,Brave ...中),而不是其他引擎。

这里有many questions with answers关于如何解决的问题,例如this one

Steven Levithan的

This article也展示了解决该功能缺失的方法。

  

我想替换所有未跟随/跟随的所有“ i”,并替换为“ z”

使用占位符和捕获组,无需先行或后行即可轻松实现。您可以捕获i之后的内容:

const rex = /i(i+|.|$)/g;

......如果捕获的不是i或一系列i,然后有条件地替换它:

const result = input.replace(rex, (m, c) => {
    return c[0] === "i" ? m : "z" + c;
});

实时示例:

const rex = /i(i+|.|$)/g;
function test(input, expect) {
    const result = input.replace(rex, (m, c) => {
        return c[0] === "i" ? m : "z" + c;
    });
    console.log(input, result, result === expect ? "Good" : "ERROR");
}

test("i", "z");
test("iki", "zkz");
test("iiki", "iikz");
test("ii", "ii");
test("iii", "iii");

答案 2 :(得分:1)

在这种情况下可以使用一种技巧。正在根据匹配更改偏移值。

let arr = ['i','iki','iiki','ii','iii', 'ki']

arr.forEach(e=>{
  let value = e.replace(/i(?!i)/g, function(match,offset,string){
    return offset > 0 && string[offset-1] === 'i' ? 'i' : 'z'
  })
  console.log(value)
})