7

我如何先更换N个在以下字符串中出现许多空格和制表符:

2017年12月7日上午11:01 21523文件名,带有s p a c e s.js

我期望得到以下结果:

2017年12月7日| 11:01 |上午| 21523 |文件名为space s.js

我知道只有通过调用replace才有不太好的选择N个同一字符串上的时间

.replace(/\s+/,“|”).replate(/\s+/,“|“).replay(/\s++,“|);

值得一提的是,我将在近1000000行上运行此命令,因此性能很重要。

  • 1
    @secreththeninja Op只想替换字符串中的前4个匹配项,从而保持文件名中的空格不变。
    – 德里克
    评论 2017年11月10日20:20
  • 将取代一切。但我只需要先更换n个个事件 评论 2017年11月10日20:21
  • 闻起来就像你可以使用某种循环 评论 2017年11月10日20:23

7个答案7

重置为默认值
9

可能是这样的:

var txt=“07/12/2017 11:01 AM 21523 filename with s p a c e s.js”;变量n=0,n=4;newTxt=txt.replace(/\s+/g,match=>n++<n?“|”:match);newTxt;//“2017年12月7日| 11:01 |上午| 21523 |文件名为s p a c e s.js”

你可以取一个计数器并将其递减。

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(结果);

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

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

2

Derek和Nina为动态替换N个空白组提供了很好的答案。如果N是静态的,则非空白标记(\S公司)可用于在空白之间匹配和保留组:

替换(/\s+(\s+)\s+(\s+)\s+/,'|1|2|')

2

这里的一些答案已经很好了,但既然你说你想要速度,我就只需要一段时间,如下所示:

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

JSFiddle上有:https://jsfiddle.net/2bxpygjr网站/

1

我会选择这样的。虽然我有点喜欢德里克的回答,所以我会查他的答案,了解他/她在其中做了什么。

var mytext=“一些由空格、空格和更多空格分隔的文本”;var迭代计数=4;while(iterationCount>0){mytext=mytext.replace(“”,“”);迭代计数--;}返回mytext;
1

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

函数repalceLeadSpaces(str,substitution,n){n=n|0;if(!str||n<=0){返回str;}str=str.replace(/\s+/,替换);返回n===1?str:repalceLeadSpaces(str,substitution,n-1)}
0

您还可以:

  • 分裂在空白处,使用捕获组来保留间距;
  • 使用地图将前N个空白元素替换为|;
  • 参加零件重新组装在一起

const str='07/12/2017 11:01 AM 21523 filename with s p a c e s.js'常数N=4const结果=str.split(/(\s+)/).map((v,i)=>i%2==0|i>=2*N?v:“|”).join(“”)console.log(结果)

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.