假设我有以下字符串:"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 :(得分: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);