我有一个字符串,其中包含应替换一次的字符(初次出现)。
这些字符是:
示例输入:
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
也将被替换,这不是我想要的。
这怎么实现?
答案 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])