在Javascript中计算正则expression式的匹配数

我想写一个正则expression式来计算大块文本中空格/制表符/换行符的数量。 所以我天真地写了下面:

numSpaces : function(text) { return text.match(/\s/).length; } 

由于某些未知的原因,它总是返回1 。 上述说法有什么问题? 我已经解决了以下问题:

 numSpaces : function(text) { return (text.split(/\s/).length -1); } 

您的初始代码的问题是您缺less全局标识符 :

 >>> 'hi there how are you'.match(/\s/g).length; 4 

如果没有正则expression式的g部分,它只会匹配第一个匹配项并在那里停止。

另外请注意,你的正则expression式会连续两次计算空格:

 >>> 'hi there'.match(/\s/g).length; 2 

如果这是不可取的,你可以这样做:

 >>> 'hi there'.match(/\s+/g).length; 1 

正如我在前面的回答中所提到的,您可以使用RegExp.exec()遍历所有匹配项并计算每个匹配项; 它的优点仅限于内存,因为总体上比使用String.match()要慢20%左右。

 var re = /\s/g, count = 0; while (re.exec(text) !== null) { ++count; } return count;