JavaScript如何将句子按单词分割?

53

如何将一个字符串中每个单词和其后面的字符一起存入数组中的一个好策略是什么。

例如:

这是一个惊人的句子。

Array(
[0] => This 
[1] => is
[2] => an
[3] => amazing
[4] => sentence.
)

元素0-3会有一个空格跟随,因为句点在第4个元素之后。

我需要您通过间隔字符将它们拆分, 然后一旦注入了数组元素的元素宽度达到X, 就换行。

请不要给我太多代码。我更喜欢自己编写,告诉我您会如何做。


使用 JavaScript 的 split 函数。 - saurabh
我会采用这个答案提供的方法:https://dev59.com/B2855IYBdhLWcg3wJQvT。但对于你的情况,请将`var newstringreplaced = string.replace(/d/gi, ",d");更改为var newstringreplaced = string.replace(/\s/gi, " ,");`。编辑:应该注意,如果您的原始字符串没有逗号“,”,则此方法才有用。我认为这个解决方案更安全:https://dev59.com/B2855IYBdhLWcg3wJQvT#4514241。 - Suvi Vignarajah
9个回答

78

Ravi的答案类似,使用match,但在正则表达式中使用单词边界\b来分割单词:

'This is  a test.  This is only a test.'.match(/\b(\w+)\b/g)
产出。
["This", "is", "a", "test", "This", "is", "only", "a", "test"]
或者
'This is  a test.  This is only a test.'.match(/\b(\w+\W+)/g)
产出。
["This ", "is  ", "a ", "test.  ", "This ", "is ", "only ", "a ", "test."]

7
这确实是最好的答案,因为按空格拆分并不适用于实际情况。除非你不使用标点符号并且始终使用单个空格。 - Alex.Me
7
这会将“won't”转换为“won”和“t”。这使得缩写变得可能:str.match(/\b(\w+)'?(\w+)?\b/g) - Thomas David Kehoe
english words only :( - iiic
1
\b 无法处理非 ASCII 字符。例如,'é'.match(/\b(\w+)\b/g) 返回 null。 - Clement
@Clement 类似于/(\p{L}+\P{L}+)/这样的正则表达式在ES2018(或PCRE)中可能有效,但我不确定是否有任何真正的支持。参考:https://dev59.com/OHVC5IYBdhLWcg3w51lv#48902765 - Isaac

68

只需使用split方法:

var str = "This is an amazing sentence.";
var words = str.split(" ");
console.log(words);
//["This", "is", "an", "amazing", "sentence."]

如果你需要加上空格,为什么不直接这样做呢?(之后再使用循环)

var str = "This is an amazing sentence.";
var words = str.split(" ");
for (var i = 0; i < words.length - 1; i++) {
    words[i] += " ";
}
console.log(words);
//["This ", "is ", "an ", "amazing ", "sentence."]

哦,还有好好睡觉!


@cars10 更改了答案 - 这样修复了吗? - h2ooooooo
3
为什么你需要在每个单词末尾添加空格?如果你希望在连接字符串时把它们加回来,只需使用.join(' '); - Dennis Martinez
我刚刚在打这个。回复得好,速度快。 - EnigmaRM
好的回答 :) 我需要空格,因为用户的句子中有空格,我计划在循环中重新输出他们的句子,而不必声明一个空格。 :) 谢谢 - THE AMAZING
2
正如Dennis Martinez所提到的,您可以简单地使用words.join(" ")再次获得This is an amazing sentence. - h2ooooooo
显示剩余5条评论

20

试试这个

var words = str.replace(/([ .,;]+)/g,'$1§sep§').split('§sep§');

这将

  1. 在每个选择的分隔符 [ .,;]+ 后插入标记 §sep§
  2. 在标记位置拆分字符串,从而保留实际的分隔符。

9
如果您需要空格和点号,最简单的方法是使用以下代码:
"This is an amazing sentence.".match(/.*?[\.\s]+?/g);

结果将会是

['This ','is ','an ','amazing ','sentence.']

8
使用 splitfilter 来删除字符串前后空格。

let str = '     This is an amazing sentence.  ',
  words = str.split(' ').filter(w => w !== '');

console.log(words);


3
这里有一个选项,如果你想在O(N)的时间内包含空格并完成。
var str = "This is an amazing sentence.";
var words = [];
var buf = "";
for(var i = 0; i < str.length; i++) {
    buf += str[i];
    if(str[i] == " ") {
        words.push(buf);
        buf = "";
    }
}

if(buf.length > 0) {
    words.push(buf);
}

3
以下解决方案不仅通过空格,还通过其他类型的空格和标点符号来分割单词。此外,它可以处理非 ASCII 字符。
它通过仅考虑属于某些字符类别的字符来匹配单词。它允许字母(L)、数字(N)、符号(S)和标记(M),因此它可以匹配相当广泛的字符集,但如果您需要不同的字符集,则可以进行调整。其他类别,如标点符号(P)和分隔符(Z),未包含在内,因此将无法匹配。
input.match(/[\p{L}\p{N}\p{S}\p{M}]+/gu)

例子
' \t a 件数  ,;-asd'.match(/[\p{L}\p{N}\p{S}\p{M}]+/gu)

返回 ['a', '件数', '', 'asd']

2
这可以通过 lodash _.words 完成:

var str = 'This is an amazing sentence.';
console.log(_.words(str, /[^, ]+/g));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>


1
可以使用 split 函数来完成:
"This is an amazing sentence.".split(' ')

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