替换字符串中的前N个出现次数

时间:2017-11-10 20:17:46

标签: javascript node.js regex replace

如何在以下字符串中替换许多空格和制表符的第一个N次出现:

07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js

我期待以下结果:

07/12/2017|11:01|AM|21523|filename with s p a c  e  s.js

我知道不是很优雅的选项,只能通过在同一个字符串上调用替换N

.replace(/\s+/, "|").replace(/\s+/, "|").replace(/\s+/, "|");

值得一提的是,我将在接近1,000,000行上运行它,因此性能很重要。

6 个答案:

答案 0 :(得分:3)

可能是这样的:

var txt = "07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js";

var n = 0, N = 4;
newTxt = txt.replace(/\s+/g, match => n++ < N ? "|" : match);

newTxt; // "07/12/2017|11:01|AM|21523|filename with s p a c  e  s.js"

答案 1 :(得分:3)

你可以拿一个计数器并递减它。

&#13;
&#13;
var string = '07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js',
    n = 4,
    result = string.replace(/\s+/g, s => n ? (n--, '|') : s);
    
console.log(result);
&#13;
&#13;
&#13;

您可以使用逻辑AND和OR替换三元表达式。

&#13;
&#13;
var string = '07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js',
    n = 4,
    result = string.replace(/\s+/g, s => n && n-- && '|' || s);
    
console.log(result);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我会选择这样的东西。虽然我有点像Derek的回答,所以我会抬起头来了解他/她在做什么。

var mytext = "some text separated by spaces and spaces and more spaces";
var iterationCount = 4;
while(iterationCount > 0)
  {
    mytext = mytext.replace(" ", "");
    iterationCount--;
  }
return mytext;

答案 3 :(得分:1)

Derek和Nina为动态替换N个空格组提供了很好的答案。如果N是静态的,则可以使用非空白标记(\S)来匹配并保持空白之间的组:

.replace(/\s+(\S+)\s+(\S+)\s+/, '|$1|$2|')

答案 4 :(得分:1)

你自己的解决方案的递归版本怎么样?

function repalceLeadSpaces(str, substitution, n) {
    n = n || 0;
    if (!str || n <= 0) {
        return str;
    }
    str = str.replace(/\s+/, substitution);
    return n === 1 ? str : repalceLeadSpaces(str, substitution, n - 1)
}

答案 5 :(得分:1)

这里的一些答案已经非常好了,但既然你说你想要速度,那我就去一次,就像这样:

var logLine = '07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js';
var N = 4;
while(--N + 1){
  logLine = logLine.replace(/\s+/, '|');
}
console.log(logLine);

这是关于JSFiddle:https://jsfiddle.net/2bxpygjr/