什么是JS回顾后支持?如何更换呢?

问题描述 投票:1回答:3

我有一个字符串,我想任何其他我更换每一个“我”,是不是跟随/跟随,并用“z`代替它。我知道,有负前瞻和回顾后。

结果应该是:

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

我试图用这样的:

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

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

然而

/i(?!i)/gi

工作正常,但第二个“我”在这种比赛:“II”。

是否有一些其他的方式?

什么是回顾后支持JS如果有任何?

javascript regex negative-lookahead negative-lookbehind
3个回答
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');

2
投票

回顾后在JavaScript正则表达式是相当新。在撰写本文时,它的only supported in V8(在Chrome中,铬,勇敢......),而不是由其他引擎。

这里关于如何解决没有回顾后,如many questions with answersthis one

由史蒂芬Levithan qazxsw POI还显示方法可以解决没有该功能的。

我想任何其他我更换每一个“我”,是不是跟随/跟随,并用“z`更换

这是很容易做到既没有超前或回顾后,使用占位符和捕获组。您可以捕获接下来的This article

i

...然后如果有条件什么被抓获不是const rex = /i(i+|.|$)/g; 或一系列is的更换:

i

活生生的例子:

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

1
投票

一个黑客可以在这种情况下使用。在改变基于匹配的偏移值。

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");
© www.soinside.com 2019 - 2024. All rights reserved.