如何在JavaScript中用字符串替换首次出现的字符?

时间:2018-10-08 11:50:18

标签: javascript replace

我有一个字符串,其中包含应替换一次的字符(初次出现)。

这些字符是:

  • L =>将替换为演讲名称
  • 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 :(得分:4)

回答您的一般问题“仅替换字符的第一次出现”,您可以这样做:

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}";

答案 1 :(得分:4)

将替换项放在地图中,替换完成后,将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])