为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

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


numSpaces : function(text) { 

    return text.match(/\s/).length; 

}

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


numSpaces : function(text) { 

    return (text.split(/\s/).length -1); 

}


查看完整描述

3 回答

?
幕布斯7119047

通用模式计数器


// 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


查看完整回答
反对 回复 2019-10-30
?
偶然的你

如我先前的回答中所述,您可以RegExp.exec()用来遍历所有匹配并计算每次匹配;优点仅限于内存,因为总体而言,它比使用慢约20%String.match()。


var re = /\s/g,

count = 0;


while (re.exec(text) !== null) {

    ++count;

}


return count;


查看完整回答
反对 回复 2019-10-30
?
手掌心

这肯定有很多陷阱。我正在研究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;

}

我保证输入并不像字面东西0,false,undefined或,null其中没有一个是字符串。由于这些文字不包含在输入字符串中,因此不应有匹配项,而应有match '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;

}


查看完整回答
反对 回复 2019-10-30

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信