Как заменить первое вхождение символа на строку в JavaScript? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть строка, содержащая символы, которые следует заменить один раз (при первом появлении).

Это следующие символы:

  • L => willбудет заменено названием лекции
  • N => будет заменено именем
  • D => будет заменено датой

Пример ввода:

L_N_L_D

Желаемый результат (обратите внимание, что заменяется только первый L):

Math_Ex01_L_2018-10-05

Мой текущий код (упрощенно для примера):

let res = file_string.replace(/L|N|D/, x => {
  switch (x) {
    case 'L': return lecture;
    case 'N': return name;
    case 'D': return date;
    default: return x;
  }
});

Что я получу так:

Math_L_N_D

Если я изменю регулярное выражениена /L|N|D/g будет также заменен второй L, что не то, что я хочу.

Как это можно реализовать?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Поместите ваши замены на карту, после замены установите map[x] на x:

let lecture = "Math";
let name = "Ex01";
let date = "2018-10-05";

let repl = {
  'L': lecture,
  'N': name,
  'D': date
};

let file_string = "L_N_L_D"

let result = file_string.replace(/[LND]/g, x => {
  let r = repl[x];
  repl[x] = x;
  return r;
});

console.log(result)

Помимо решения рассматриваемой проблемы, это также значительно упрощает функцию замены (например, добавление новых заполнителей).

При этом,реальным решением вашей проблемы было бы следовать совету @ marsze и использовать однозначные заполнители, такие как {...}, и в этом случае все предприятие становится просто

 repl = {...as before...}
 result = subject.replace(/{(.+?)}/g, (_, x) => repl[x])
0 голосов
/ 08 октября 2018

Отвечая на ваш общий вопрос «заменить только первое вхождение символа», вы можете сделать это так:

var lecture = "Math";
var name = "Ex01";
var date = "2018-10-05";
var found = {};
var file_string = "L_N_L_D";
var filename_result = file_string.split("").map(function (character) {
  if (!found[character]) {
    found[character] = true;
    switch (character) {
      case "L": return lecture;
      case "N": return name;
      case "D": return date;
    }
  }
  return character;
}).join("");
console.log(filename_result);

Вы, вероятно, должны объяснить, откуда взялся этот нечетный формат file_string.Существуют ли другие подобные варианты использования?Или это как раз об этом конкретном примере?Понимание исходных требований очень помогло бы.

Если file_string должна быть настраиваемой строкой формата, то ее следует улучшить.Последовательность, которая служит заменой для замены, должна (или должна ) отличаться от литерала, например:

var filename_format = "{L}_{N}_L_{D}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...