在JavaScript中的字符串中保留N个出现的单个字符

时间:2018-08-02 17:36:43

标签: javascript string

假设我有以下字符串:"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>

但是我想知道是否有更好的方式...

2 个答案:

答案 0 :(得分: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分析。

答案 1 :(得分:2)

您可以使用正则表达式查找下划线和保留下划线的计数器,并替换所有其他下划线。

var string = "a_b_c_d_restofthestring",
    result = string.replace(/_/g, (c => _ => c && c-- ? _ : '')(2));
    
console.log(result);