计算Javascript中正则表达式的匹配数


98

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

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

由于某些未知原因,它总是返回1。上面的陈述有什么问题?此后,我通过以下方法解决了该问题:

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

Answers:


191

tl; dr:通用模式计数器

// THIS IS WHAT YOU NEED
const count = (str) => {
  const re = /YOUR_PATTERN_HERE/g
  return ((str || '').match(re) || []).length
}

对于那些来到这里的人来说,他们正在寻找一种通用的方法来计算字符串中正则表达式模式的出现次数,并且不希望出现次数为零的情况失败,那么此代码就是您所需要的。这是一个示范:

/*
 *  Example
 */

const count = (str) => {
  const re = /[a-z]{3}/g
  return ((str || '').match(re) || []).length
}

const str1 = 'abc, def, ghi'
const str2 = 'ABC, DEF, GHI'

console.log(`'${str1}' has ${count(str1)} occurrences of pattern '/[a-z]{3}/g'`)
console.log(`'${str2}' has ${count(str2)} occurrences of pattern '/[a-z]{3}/g'`)

原始答案

初始代码的问题是缺少全局标识符

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

没有g正则表达式的部分,它将仅匹配第一个匹配项并在此停止。

还要注意,您的正则表达式将对连续的空格计数两次:

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

如果不希望这样做,则可以执行以下操作:

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

5
只要输入中至少有一个空格,此方法就起作用。否则,match()会烦人地返回null。
sfink 2011年

3
sfink是正确的,您肯定想检查match()是否返回null:var result = text.match(/\s/g); return result ? result.length : 0;
Gras Double

37
您还可以使用以下结构来防止null:( str.match(...) || [] ).length
2011年




0

这肯定有很多陷阱。我正在研究Paolo Bergantino的答案,并意识到即使那样也有一些局限性。我发现使用日期的字符串表示形式是快速找到一些主要问题的好地方。从这样的输入字符串开始: '12-2-2019 5:1:48.670'

并按以下方式设置Paolo的功能:

function count(re, str) {
    if (typeof re !== "string") {
        return 0;
    }
    re = (re === '.') ? ('\\' + re) : re;
    var cre = new RegExp(re, 'g');
    return ((str || '').match(cre) || []).length;
}

我希望传入正则表达式,以便函数更可重用,其次,我希望参数为字符串,这样客户端就不必制作正则表达式,而只需在字符串上进行匹配,例如标准的字符串实用程序类方法。

现在,在这里您可以看到我正在处理输入问题。具有以下内容:

if (typeof re !== "string") {
    return 0;
}

我保证输入并不像字面的东西0falseundefined或,null其中没有一个是字符串。由于这些文字不包含在输入字符串中,因此不应有匹配项,但应匹配'0',这是一个字符串。

具有以下内容:

re = (re === '.') ? ('\\' + re) : re;

我正在处理这样一个事实,即RegExp构造函数将(我认为是错误的)将字符串解释'.'为所有字符匹配器\.\

最后,因为我使用的是RegExp构造函数,所以需要给它提供全局'g'标志,以便它计算所有匹配项,而不仅仅是第一个匹配项,这与其他文章中的建议类似。

我意识到这是一个非常晚的答案,但对于在这里绊脚的人可能会有所帮助。顺便说一句,这是TypeScript版本:

function count(re: string, str: string): number {
    if (typeof re !== 'string') {
        return 0;
    }
    re = (re === '.') ? ('\\' + re) : re;
    const cre = new RegExp(re, 'g');    
    return ((str || '').match(cre) || []).length;
}

-2

这样怎么样

function isint(str){
    if(str.match(/\d/g).length==str.length){
        return true;
    }
    else {
         return false
    }
}
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.