如何通过空格分隔字符串,并使用正则表达式忽略开头和结尾的空格成单词数组?


76

我通常在JavaScript中使用以下代码按空格分割字符串。

"The quick brown fox jumps over the lazy dog.".split(/\s+/);
// ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

即使单词之间有多个空格字符,这当然也可以使用。

"The  quick brown fox     jumps over the lazy   dog.".split(/\s+/);
// ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

问题是当我有一个带有前导或尾随空格的字符串时,在这种情况下,所得的字符串数组将在该数组的开头和/或结尾包含一个空字符。

"  The quick brown fox jumps over the lazy dog. ".split(/\s+/);
// ["", "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog.", ""]

消除这些空字符是一项微不足道的任务,但是如果可能的话,我宁愿在正则表达式中进行处理。有人知道我可以使用什么正则表达式来实现此目标吗?


马匹的课程。split用于拆分字符串,而不是对其进行突变。看看如何在JavaScript中修剪字符串?
DCoder

不幸的是,javascript不支持lookbehind,即使您使用过lookbehind,在第一次分割中也会有空间
Anirudha

我从那个角度没有想到过。感谢您指出了这一点!
natlee75

分割前不能做trim()吗?
雅克·考特斯

Answers:


119

如果您对不是空格的位更感兴趣,则可以匹配非空格而不是在空格上分割。

"  The quick brown fox jumps over the lazy dog. ".match(/\S+/g);

请注意,以下返回null

"   ".match(/\S+/g)

因此,最好的学习模式是:

str.match(/\S+/g) || []

9
当心,' '.match(/\S+/g)返回null而不是[]
安迪

我想知道您的解决方案或@Josh的解决方案更快(如果我们处理[“”]情况)。
ibodi

49

" The quick brown fox jumps over the lazy dog. ".trim().split(/\s+/);


3
谢谢你的建议。实际上,我一直走这条路,直到我想起它需要一个支持JavaScript 1.8的浏览器。对于我们的大多数用户来说,这很好,但是我们仍然支持旧版本的浏览器,例如Internet Explorer 7和8,它们的JavaScript引擎不包含此功能。
natlee75

9
当心,' '.trim().split(/\s+/)退货[""]
安迪

我想知道您的解决方案更快(如果我们处理[“”]案例)或@kennebec的解决方案
ibodi

16

您可以匹配任何非空白序列,而不是按空白序列进行拆分:

"  The quick brown fox jumps over the lazy dog. ".match(/\S+/g)

0

不像其他代码那样优雅,但很容易理解:

    countWords(valOf)
    {
        newArr[];
        let str = valOf;
        let arr = str.split(" ");

        for (let index = 0; index < arr.length; index++) 
       {
           const element = arr[index];
           if(element)
           {
              newArr.push(element);
           }
       }
       const NumberOfWords = newArr.length;

       return NumberOfWords;
   }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.