JavaScript найти каждый экземпляр регулярного выражения в строке и заменить его другими значениями - PullRequest
0 голосов
/ 27 января 2020

Я видел подобные вопросы на этот вопрос, но ни один из них не пытался достичь того же самого. Мне нужно найти каждый экземпляр шаблона регулярного выражения, но заменить каждый экземпляр другим значением. Вот мой код:

function replacingText(){
     var names = ["Ethan", "Kyle", "Chase", "Cole"];
     var sentance = 'This is [Cole] and [Chase].'
     var regex = /\[(.*?)\]/gm;
    for(i of names){
    sentance = sentance.replace(regex, i);
    }
    console.log(sentance);
}

Этот код приводит к следующему:

This is Ethan and Ethan.

Но я хочу:

This is Ethan and Kyle.

Действительно, мне просто нужен какой-то способ найдите каждый элемент, заключенный в квадратные скобки [], замените этот элемент уникальным значением и затем перестройте строку с новыми значениями. Я не пристрастен к любому подходу.

Ответы [ 3 ]

1 голос
/ 27 января 2020

Попробуйте удалить g из регулярных выражений. Помогает

1 голос
/ 27 января 2020

Вы можете передать функцию в .replace (), функция должна вернуть значение замены:

function replacingText(){
    var names = ["Ethan", "Kyle", "Chase", "Cole"];
    var sentance = 'This is [Cole] and [Chase].'

    sentance.replace(/\[(.*?)\]/g, function() {
        return names.shift();
    });
}
1 голос
/ 27 января 2020

Если кажется, что вы хотите найти совпадение и заменить его первой строкой в ​​массиве, а для следующего совпадения заменить его второй строкой, et c? Вы также должны рассмотреть случай, когда в этом массиве заканчиваются элементы.

В исходном коде вы заменяете все на первое совпадение, а [ и ] исчезают. Поэтому вам нужно заменить один, а затем go на следующий:

function replacingText() {
  var names = ["Ethan", "Kyle", "Chase", "Cole"];
  var sentance = 'This is [Cole] and [Chase].'
  var regex = /\[(.*?)\]/m;
  i = 0;
  while (regex.test(sentance) && i < names.length) {
    sentance = sentance.replace(regex, names[i]);
    i++;
  }
  console.log(sentance);
}

replacingText();

Ваш оригинальный код тоже работает, если заменить только одно вхождение:

function replacingText() {
  var names = ["Ethan", "Kyle", "Chase", "Cole"];
  var sentance = 'This is [Cole] and [Chase].'
  var regex = /\[(.*?)\]/m;
  for (i of names) {
    sentance = sentance.replace(regex, i);
  }
  console.log(sentance);
}

replacingText();

Но обратите внимание: если в массиве содержится 20 или 200 элементов, он будет проходить через массив для каждого элемента, даже если совпадений нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...