需要将字符串分块为140个字符的块,同时尊重单词



我有一个非常简单的问题,但需要一个有效的解决方案。我有一个节点脚本,它打开一个文本文件,在每一行上循环,如果行超过140个字符,则将其分块,但需要尊重单词边界。这是我目前为止所拥有的,但线条没有受到影响。我也尝试过_.invoke(lines, function() { splitText(this); };,但这也不会影响行。有人能提出另一种方法吗?

var args = process.argv.splice(2),
fs = require('fs'),
_ = require('underscore'),
splitText;
splitText = function (textSegment) {
var len = 140, curr = len, prev = 0, output = [], currReverse;
while (textSegment[curr]) {
if (textSegment[curr++] == ' ') {
output.push(textSegment.substring(prev, curr));
prev = curr;
curr += len;
} else {
currReverse = curr;
do {
if (textSegment.substring(currReverse - 1, currReverse) == ' ') {
output.push(textSegment.substring(prev, currReverse));
prev = currReverse;
curr = currReverse + len;
break;
}
currReverse--;
} while (currReverse > prev);
}
}
output.push(textSegment.substring(prev));
return output;
}
text = fs.readFileSync(args[0], 'utf-8');
lines = text.split("n");
lines = _.filter(lines, function (line) {
return line.length >= 100;
});
lines = _.map(lines, function (line) {
return splitText(line);
});
fs.writeFile(args[0], lines.join("n"), function (err) {
if (err) throw err;
console.log('test');
});

我对underscore.js没有任何经验,但我知道一个非常简单的方法可以在没有它的情况下解决这个问题:

function formatStr(text, len) {
len = len||140;
var i=0,
str, newline, breakpt,
formatted = '';
while (i+len<text.length) {
str = text.substr(i, len);
newline = str.indexOf('n');
if (newline!=-1) {
formatted += str.substr(0,newline+1);
console.log(i,newline);
i += newline + 1;
continue;
}
breakpt = str.lastIndexOf(' ');
formatted += str.substr(0,breakpt) + 'n';
i+=breakpt+1;
}
// add last line to the end and return; credit to Charly
// for mentioning this was missing.
return formatted + text.substr(i);
}

演示

这个循环的作用如下:

  • 将接下来的140个字符存储在var中
  • 测试此字符串中是否已有换行符
    • 如果是,只需将字符串的该部分添加到格式化的字符串中,然后从中添加continue
  • 获取字符串变量中空间的最后一个索引
  • 将字符串的一部分追加到格式化字符串中的下一个空格
  • 最后,返回格式化后的字符串

这是一个旧线程,但这里有一个快速解决方案。

试试这个regex,你可以在这里看到它的工作原理:http://regexper.com/#%5E(%5Cr%5Cn%7C.)%7B1%2C140%7D%5Cb

str.match(/^(rn|.){1,140}b/g).join('')

最新更新