将字符串分成每行包含36个字符的数组,且不打断单词

时间:2019-02-06 04:00:32

标签: javascript regex split

我正在尝试将每个索引中的字符串拆分为36个字符的数组。同样,单词在此拆分期间不应中断。我正在使用下面的代码在不中断单词的情况下拆分字符串,但这将在到达36后检查下一个空格。我的要求是,如果第一个索引达到36个字符,则它应检查该行中的上一个空格并将此单词移至数组中的下一个索引。

例如,如果我有一个字符串“这是要开发的新内容”,则应分成两行,作为

[0]-这是

的新内容

[1]-开发中

当前下面的代码将其分成一行,例如

[0]-这是开发的新内容

         var count; var len=36; 
         var curr = len; var prev = 0;          
         while (data[curr]) { 
                   if (data[curr++] == ' ') { 
                        splitArr.push(data.substring(prev,curr)); 
                         prev = curr; 
                          curr += len; 
                        } 
                      } 

        splitArr.push(data.substr(prev)); 

如果要获得36个字符前的空白,我可以使用什么代替data [curr ++]?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我个人将字符串分解成单词,然后将它们添加到批处理中,直到我们通过最大大小(36),然后开始新的批处理。

我们用.split()将字符串分成单词。我使用正则表达式而不是常规的.split(" "),因为我想在分割字符串时包含空格

当我们遍历项目时,我们看最后一个项目。将此字符串添加到最后一个项目中是否会超过36个字符?如果是这样,它将启动一个 new 项目。如果没有,则将其添加到上一个。

要迭代和合并项目,我选择使用Array.reduce()

const str = "This is a demonstration of how your code might work with a longer text string. ";
const charLimit = 36;

let result = str
    .split(/(\s+)/)
    .reduce((output, item) => {
      let last = output.pop() || "";                   //get the last item
      return last.length + item.length > charLimit     //would adding the current item to it exceed 36 chars?
        ? [...output, last, item]                      //Yes: start a new item
        : [...output, last + item]                     //No:  add to previous item  
    }, []);

console.log("Result:");
console.log(result);

console.log("With lengths:");
console.log(result.map(i => ({string: i, length: i.length})));

console.log("Trimmed:");
console.log(result.map(i => i.trim()));

答案 1 :(得分:0)

我想到使用单词边界的最简单方法

(?:^|\b)[\w .]{1,36}(?:\b|$)

let str = `This is a demonstration of how your code might work with a longer text string`

let op = str.match(/(?:^|\b)[\w .]{1,36}(?:\b|$)/gi)

console.log(op)

Regex demo