Javascript编辑文本文件-删除所有空行,但删除一个

时间:2018-11-12 12:23:52

标签: javascript arrays

我刚刚开始学习Javascript,并且我正在尝试实施一个想到的项目。该项目是一个简单的文本编辑器,它以文本为输入进行一些更正,并以固定文本发布输出。

输入文本将作为数组导入。文本的每一行都是一个对象属性。 inputText用于在div内的浏览器中显示默认文本,而outputText是我用于编辑的文本。

inputText = loadStrings("v.txt");
outputText = inputText;

现在输入文本包含一些句子。问题在于它们之间有很多空行。

firstLine



secondLine






thirdLine

我要实现的是删除所有空行,但是要删除其中一行,因此输出文本如下所示:

firstLine

secondLine

thirdLine

我正在寻找将近3天的解决方案。我设法删除了所有空行,但这不是我想要的。我想删除多于一行的空行,但是如果只有一行空行,则不做任何更改。

这段代码是我尝试过的许多代码之一。这将删除所有空行:

(来源:Remove empty elements from an array in Javascript

outputText = outputText.filter(function(e){
    return e.replace(/[\r\n]+/g, '\n')});

这是我使用的所有HTML,CSS和JS代码的代码库。 https://codepen.io/theokondak/pen/KrNNVz

5 个答案:

答案 0 :(得分:0)

尝试:

% create cell 1xcxp cell from r, where each cell is mx1 vector
R = mat2cell(r, m, ones(c,1), ones(p,1));
% make each cell a sparse diagonal matrix
R = repmat(cellfun(@(x) spdiags(x,0,m,m), R, 'UniformOutput', false), s, 1, 1);
% do point-wise computation
C = cellfun(@(x,y,z) z*(x.*y),  repmat(J',1,c,p), mat2cell(l,ones(s,1),ones(c,1),ones(p,1)), R, 'UniformOutput',false);
% sum over each row of resulting cell C
J_ = cell(1,c,p);
J_(:) = {0};
for si=1:s
  J_(1,:,:) = cellfun(@(x,y) (x+y), J_(1,:,:), C(si,:,:), 'UniformOutput',false);
end
% stack final cell and convert it to sparse matrix
J_final = cell2mat(cat(1,J_(:)));

我不确定上面的过滤器功能。但尝试以下一项必须有效。

outputText = outputText.filter(function(e){
    return e.replace(/[\r\n]+/g, '\n\n')});

替换两行是最简单的方法。你会得到你想要的。

答案 1 :(得分:0)

尝试此正则表达式:

e.replace(/([\r\n]){2,}/g, '\n\n')});

这将仅匹配两个或多个连续的空行,并替换为空行。

我的测试代码:

var lines = 'firstLine\n\n\n\nsecodLine\n\n\n\n\n\n\nthirdLine';
/*
firstLine



secondLine






thirdLine
*/
console.log(lines.replace(/([\r\n]){2,}/g, '\n\n'));

/*
firstLine

secodLine

thirdLine
*/

答案 2 :(得分:0)

我不知道loadStrings是否在行尾放置换行符。我假设它会这样做(基于我在此页面上看到的一些代码)。如果最终变形,请这样说。

像HélioMárcioFilho所说的那样,在单个字符串上执行此操作绝对容易。因此,在您从数组开始的情况下,您可以将数组连接在一起,用两个替换三个或更多换行符,然后将其拆分成几行:

let outputText = inputText.join('').replace(/(?:\r?\n){3,}/g, '\n\n').
  split(/\n/).map(line => line + "\n");

但是您也可以只用filter来做-您只需要知道刚看到的空行数,并消除多余的行即可:

let empties = 0;
let outputText = inputText.filter(line => {
  if (line.replace(/[\r\n]+/, '')) empties = 0;
  else empties++;
  return empties <= 1;
});

答案 3 :(得分:0)

其他答案仅适用于单个字符串,但是您正在使用Processing.js中的loadStrings()函数,该函数为您提供了一个字符串数组。

您可以将数组转换为单个字符串,或将文件作为单个字符串加载,但是如果您仅处理数组,这对我来说似乎最简单。像这样:

function reduceNewlines(inputArray){

  var outputNewArray = [];
  var previousLineWasNewline = false;

  for(var i = 0; i < myArray.length; i++){
    if(myArray[i] == ''){
      if(!previousLineWasNewline){
        outputArray.push('');
      }
      previousLineWasNewline = true;
    }
    else{
      outputArray.push(myArray[i]);
      previousLineWasNewline = true;
    }
  }
  return outputArray;
}

请注意,我尚未测试此代码,可能还有很多改进的余地。但是总的思路就在那里:您可以编写一个函数处理数组并返回一个删除了连续换行符的新数组。

您还可以考虑对文本文件进行预处理,因此根本不需要这样做。

答案 4 :(得分:0)

首先,我要感谢大家的帮助。我研究了您的所有答复,对它们中的每一个进行了测试,并且它们都可以作为独立代码工作(有些需要进行调整),但是当我将它们插入到我的代码中时,出现了一些问题。因此,我苦苦挣扎,提出了自己的解决方案,该解决方案深受您的评论启发。

所以在我的案例中起作用的代码是:

function reduceNewlines(outputTextEditNewLines) {

  for (let key = 0; key < outputTextEditNewLines.length; key++) {
    if (outputTextEditNewLines[key] == '') outputTextEditNewLines[key] = '\n';
    else outputTextEditNewLines[key] = outputTextEditNewLines[key];
  }

  arrayToString = outputTextEditNewLines.join(""); // convert object myArray to string
  console.log(arrayToString.replace(/([\r\n]){1,}/g, '\n\n')); // exports the text as it should

  return arrayToString.replace(/([\r\n]){1,}/g, '\n\n');

}

console.log会按原样导出文本。现在,我的项目的下一步是使此字符串在console.log中打印时打印到DOM。