Что такое поддержка в JS?Как это заменить? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть строка, и я хочу заменить каждое 'i', которое НЕ следует / не следует за любым другим 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, если она есть?

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

В вашем случае вам на самом деле не нужно оглядываться назад:

'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');
0 голосов
/ 10 февраля 2019

Один хак вы можете использовать в этом случае.изменяет значение смещения на основе соответствия.

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)
})
0 голосов
/ 10 февраля 2019

Регулярные выражения в JavaScript довольно новы.На момент написания статьи поддерживается только в V8 (в Chrome, Chromium, Brave ...), но не в других движках.

Есть много вопросов с ответами здесь о том, как обойти, не имея взгляда сзади, например этот .

Эта статья Стивена Левитана также показывает способы обойти отсутствие функции.

Я хочу заменить каждое 'i', которое НЕ следует / не следует за любым другим i, и заменить его на 'z`

Это довольно легко обойтись безили lookahead или lookbehind, используя заполнители и группу захвата.Вы можете захватить то, что следует за i:

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

... и затем условно заменить его, если то, что было захвачено, не является i или серией i s:

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

Live Пример:

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");
...