【问题标题】:Explode string by length, preserving words按长度分解字符串,保留单词
【发布时间】:2017-07-08 02:41:04
【问题描述】:

使用 javascript,我想将任意长度的字符串分成最多 80 个字符的段。需要注意的是我不想断词。比如我目前正在使用这里列出的方法Split large string in n-size chunks in JavaScript

var dialog_array = dialog_to_load.match(/.{1,80}/g);

问题是,从第 76 个字符开始到第 84 个字符结束的单词将被分成两半。是否有一些简洁的正则表达式或代码来防止这种情况发生?

为了澄清,我可以编写一个小函数来实现这一点,我只是想知道是否有一种干净、更时尚的方式。

字符串可以是任意长度和内容,但这里有一个示例:

Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat。 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum。

【问题讨论】:

  • 请具体说明问题?
  • 显示输入字符串
  • 字符串可以是任意长度和内容

标签: javascript arrays string


【解决方案1】:

你可以使用这个正则表达式:

/\S.{1,79}(?=$|\s)/g

\S 确保一行将以非空格开头。因此,.{1,79} 中的计数需要少一。使用前瞻 (?= 可以确保匹配在前面有空格或字符串结尾 ($) 时停止。

当与match() 一起使用时,您将获得所需的行,并在出现换行符的位置删除空格。

下面的sn-p使用50作为宽度而不是80,所以渲染得很好:

var s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
var res = s.match(/\S.{1,49}(?=$|\s)/g);
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 你检查我的答案了吗?我看到了您对关于分割that's 的其他答案的评论。我提出的解决方案没有这个问题。有没有发现其他问题?
  • 为什么投反对票?我想知道哪里出了问题,以便改进...
【解决方案2】:

如何使用例如/.{1,80}\b/g 尊重单词边界?

【讨论】:

  • 这是一个非常好的主意!只是在达到 80 个字符限制之前没有断字的罕见情况下,行首的字符会丢失。但是有 80 个字符,这是相当理论上的。
  • 另外,标点符号之前可能会出现中断,例如 word, word 可能会出现在 ['word', ', word']
  • 这几乎正是我所需要的!它会破坏像that's 这样的词,理论上它会破坏word.。有没有办法像这样保留标点符号?最好的答案,无论如何,但如果这是可以管理的会很好:)
猜你喜欢
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2018-05-27
  • 2020-02-11
相关资源
最近更新 更多