Скажем, у меня есть эта строка: "a_b_c_d_restofthestring"
и я хочу только сохранить (например) 2 подчеркивания. Так,
"a_b_cdrestofthestring"
"abc_d_restofthestring"
Имеются оба допустимых выхода.
Моя текущая реализация:
let str = "___sdaj___osad$%^&*";
document.getElementById('input').innerText = str;
let u = 0;
str = str.split("").reduce((output, c) => {
if (c == "_") u++;
return u < 2 || c != "_" ? output + c : output;
});
document.getElementById('output').innerText = str;
<div id="input"></div>
<div id="output"></div>
Но я хотел бы знать, есть ли лучший способ...
Ваш код, кажется, работает нормально, но здесь однострочное регулярное выражение, которое заменяет все, кроме двух последних символов подчеркивания, из входной строки.
let input = "___sdaj___osad$%^&*";
let output = input.replace(/_(?=(.*_){2})/g, '');
console.log("input: " + input);
console.log("output: " + output);
Это, конечно, не очень обобщенно, и вам нужно будет изменять регулярное выражение каждый раз, когда вы хотите сказать, заменить символ, отличный от подчеркивания, или разрешить 3 вхождения. Но если вы в порядке, то это решение имеет немного меньше кода для поддержки.
Обновление: здесь альтернативная версия, полностью обобщенная и должна немного улучшиться:
let input = "___sdaj___osad$%^&*";
function replace(input, char = '_', max = 2, replaceWith = '') {
let result = "";
const len = input.length;
for (let i = 0, u = 0; i < len; i++) {
let c = input[i];
result += (c === char && ++u > max) ? replaceWith : c;
}
return result;
}
console.log("input: ", input);
console.log("output: ", replace(input));
См. Этот анализ jsPerf.
Вы можете принять регулярное выражение, которое ищет подчеркивание и счетчик подчеркивания и заменяет все остальные.
var string = "a_b_c_d_restofthestring",
result = string.replace(/_/g, (c => _ => c && c-- ? _ : '')(2));
console.log(result);
str = str.replace(/^(.*?_.*?_)(.*)$/,(_,a,b) => a+b.replace(/_/g,''))