JS的外观支持是什么?如何更换?

Ski*_*lGG 1 javascript regex negative-lookbehind negative-lookahead

我有一个字符串,我想替换所有不跟随/跟随任何其他i的'i',并将其替换为'z`.我知道有负面的前瞻和后视.

结果应该是:

i => z
iki => zkz
iiki => iikz
ii => ii
iii => iii
Run Code Online (Sandbox Code Playgroud)

我试着用这个:

/(?<!i)i(?!i)/gi
Run Code Online (Sandbox Code Playgroud)

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

然而

/i(?!i)/gi
Run Code Online (Sandbox Code Playgroud)

工作正常,但匹配第二个"我":"ii".

还有其他方法吗?

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

T.J*_*der 5

JavaScript 正则表达式中的 Lookbehind 是相当新的。截至撰写本文时,它仅在 V8 中受支持(在 Chrome、Chromium、Brave...),其他引擎不支持。

这里有很多关于如何解决没有lookbehind问题的问题和答案,比如这个

Steven Levithan 的这篇文章还展示了解决该功能缺失的方法。

我想替换每个不跟随/跟随任何其他 i 的“i”并将其替换为“z”

使用占位符和捕获组,无需前瞻或后瞻,就可以很容易地做到这一点。您可以捕获以下内容i

const rex = /i(i+|.|$)/g;
Run Code Online (Sandbox Code Playgroud)

...然后如果捕获的内容不是si的 or 序列,则有条件地替换它i

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

实例:

const rex = /i(i+|.|$)/g;
Run Code Online (Sandbox Code Playgroud)


mel*_*ene 5

在你的情况下,你真的不需要后视:

'iiki'.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z')
Run Code Online (Sandbox Code Playgroud)

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

以下是您的所有测试用例:

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');
Run Code Online (Sandbox Code Playgroud)