【问题标题】:Many insertion into a big string许多插入到一个大字符串中
【发布时间】:2017-06-14 14:51:45
【问题描述】:

我有一个 200 000 个符号宽的字符串。我需要将\index{term1} 替换为\index0001{term1},将\index{term2} 替换为\index0002{term2} 等。因此,对于每个术语,我都有一个索引号,我需要在\index 之后插入它。如果特定术语遇到多个,则其索引号仍然相同。

这种替换的数量是事先知道的。我也知道每次替换的确切位置。

如何快速完成?

我是 JS 中的新手,在 С++ 中,我会为新字符串分配足够大的缓冲区并在替换之间复制部分,并在其间插入替换。

【问题讨论】:

  • 我们希望看到minimal reproducible example中的努力和代码
  • @mplungjan 我更喜欢需要一个想法,我可以用谷歌搜索代码或自己编写代码很容易。性能很重要。
  • 这样的问题在 SO 上是题外话。拆分和加入怎么样?我希望看到一个前后示例,其中包含更好的示例术语
  • @mplungjan 我无法拆分,因为我没有单个分隔符。花括号内的部分可能会有很大差异。
  • 所以看看循环/替换需要多长时间 - for (var i=0;i<terms.length;i++) longstring=longstring.replace(new Regex("index"+term[i],"/g"),"\index"+pad(i)+term[i])

标签: javascript string performance memory insert


【解决方案1】:

看看这个

function pad(num){
  return ("0000"+num).slice(-4);
}
var longstring = "\indexterm1, \indexterm3, \indexterm3",
 terms = ["term1","term2","term3"],
  parts = longstring.split("index");

for (var i=1;i<parts.length;i++) { // start at 1 since \index splits weird
  var part = parts[i].split(",")[0],
      pos = terms.indexOf(part);
  parts[i]="\\index"+pad(pos+1)+part+", ";
}
longstring=parts.join("");

console.log(longstring);

【讨论】:

    【解决方案2】:

    您可以将数字分开并填充它并与匹配的字符串一起返回。

    var string = '\index{term1}\index{term2}\index{term95}',
        result = string.replace(/\{term(\d+)\}/g, function (match, n) {
            n = n.toString();
            while (n.length < 4) {
                n = '0' + n;
            }
            return n + match;
        });
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2022-01-08
      • 2011-08-02
      相关资源
      最近更新 更多