基于字符数和空格,使用正则表达式分割字符串

4

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

我一直在使用以下方法:

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个字符会发生什么?它会被分割还是被忽略? - Tim Biegeleisen
1
那种情况绝不应该发生,所以我会说它不能在中间被切断。 - alexmngn
2个回答

4

这个行为稍有不同。它在17个字符内找到最后一个可能的断点,而OP的正则表达式在17个字符之后找到第一个可能的断点。虽然这可能是可取的。 - 4castle
@alexmngn,你能提供一个例子吗? - vks
https://regex101.com/r/ff7iZp/2 - 最后的标点符号移到下一行,有些句子以空格开头。 - alexmngn

1
您可以在第一个正则表达式中添加单词边界断言\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”声望俱乐部的一员感觉很好(刚刚加入);) - 4castle
不要期望与Jon Skeet一起享受豪华轿车的服务,但是,这确实是一个巨大的成就 :-) - Tim Biegeleisen
由于某种原因,这会在句子中间添加 @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
@alexmngn,我对第二个正则表达式进行了更改以解决这个问题。 - 4castle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接