【问题标题】:Split a string with regex based on number of characters and spaces根据字符数和空格数使用正则表达式拆分字符串
【发布时间】:2016-10-27 04:40:08
【问题描述】:

我需要将一个字符串拆分成一个数组,根据字符的数量并且不截断一个单词。

我一直在用这个:

var charPerLine = 17;
var regex = new RegExp('^(.{'+charPerLine+'}\\S*\\s+', 'g');
var output = str.replace(regex, "$&@").split(/\s+@/);

这段代码的问题是有时我得到一个长度超过 17 个字符的字符串,如果空格接近最新的字符。

例如,

var str = "I want you to do something else instead.";

被分成:

var output = ["I want you to do something", "else instead."]

但第一个字符串超过17个字符,我需要将其拆分如:

var output = ["I want you to do", "something else", "instead."]

它还必须与标点符号和单/双引号一起使用

有什么建议吗?

【问题讨论】:

  • 问题:如果一个单词超过15个字符会怎样?它会在某个地方裂开,还是我们吃掉它?
  • 那不应该发生,所以我会说不应该在中间被切断

标签: javascript regex string


【解决方案1】:
(?=(\b.{1,17}\b))\1

您可以使用它并替换为$1\n。参见演示。

https://regex101.com/r/ff7iZp/1

【讨论】:

  • 顺便说一句,它的行为略有不同。它找到 last 可能的中断机会 in 17 个字符,而 OP 的正则表达式发现 first 可能的中断机会 after 17 个字符。不过,这可能是可取的。
  • @alexmngn 你能举个例子吗
  • regex101.com/r/ff7iZp/2 - 最后的标点符号转到下一行,一些句子以空格开头。
【解决方案2】:

您可以在第一个正则表达式中添加单词边界断言\b,这样如果它当前位于新单词的开头,它就不会与\S* 一起前进:

var str = "I want you to do something else instead";

var charPerLine = 15;
var regex = new RegExp('.{'+charPerLine+'}(?:\\b|\\S*\\s+)', 'g');
var output = str.replace(regex, "$&@").split(/\s*@\s*/);

console.log(output);

【讨论】:

  • @TimBiegeleisen 谢谢,我真的很感激。在“k”的代表俱乐部感觉很好(刚刚得到它);)
  • 不要指望与 Jon Skeet 一起乘坐豪华轿车,但是,是的,这是一个巨大的成就 :-)
  • 出于某种原因,这会在句子中间添加@var string = 'It\'s easy to get into and it doesn\'t take much effort, but long-term it always leaves you wanting more.'; output = [ 'It\'s easy to get@ into and it doesn\'t', 'take much effort@, but long-term', 'it always leaves@ you wanting more@.' ]
  • @alexmngn 我对第二个正则表达式进行了更改以解决该问题。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多