Хранить N вхождений одного символа в строке в Javascript

1

Скажем, у меня есть эта строка: "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>

Но я хотел бы знать, есть ли лучший способ...

  • 0
    Вы хотите удалить все после первых двух подчеркиваний?
  • 0
    str = str.replace(/^(.*?_.*?_)(.*)$/,(_,a,b) => a+b.replace(/_/g,''))
Показать ещё 4 комментария
Теги:
string

2 ответа

2
Лучший ответ

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

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.

2

Вы можете принять регулярное выражение, которое ищет подчеркивание и счетчик подчеркивания и заменяет все остальные.

var string = "a_b_c_d_restofthestring",
    result = string.replace(/_/g, (c => _ => c && c-- ? _ : '')(2));
    
console.log(result);
  • 0
    +1 Умный. Быстрее, чем мое решение Regex (см. Обновленный jsPerf), вероятно, потому, что оно не требует возврата, и его легче сделать универсальным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню